2016-12-30 11 views
1
CREATE TABLE #MyTempTable 
(
    Name varchar(30) 
) 

CREATE PROC InsertData_To_TempTable(--Varying number of Names will go here) 
AS 
BEGIN 
    INSERT INTO #MyTempTable(Name) 
    VALUES (--Varying list of values as input parameters from procedure) 
END 

EXEC InsertData_To_TempTable ('A'),('B') -- one time I may want to insert TWO values 

EXEC InsertData_To_TempTable ('A'),('B'),('C') -- other time I may want to insert THREE values 

さまざまな名前のテーブルを動的に挿入する方法はありますか?プロシージャへの入力パラメータに基づいて可変数の値を動的に挿入する

+0

のいずれかを必要に応じて、これはカンマ区切り自分の価値観を送信したり、*ユーザーを追加することを検討し、あなたがスプリット/解析機能付き

Declare @Names varchar(max) = 'Smith, John|Williams, Bill' Insert Into #MyTempTable(Name) Select RetVal from [dbo].[udf-Str-Parse] (@Names,'|') 

UDFを

Declare @Names varchar(max) = 'Smith, John|Williams, Bill' Insert Into #MyTempTable(Name) Select RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) From (Select x = Cast('<x>'+ replace((Select @Names as [*] For XML Path('')),'|','</x><x>')+'</x>' as xml).query('.')) as A Cross Apply x.nodes('x') AS B(i) 

を好む何もすることができますあなたのprocのパラメータとして定義されたテーブル型* – Stephen

+0

ストアドプロシージャではなく 'insert'を使うのはどうですか? –

+0

詳細な解答を見る@GordonLinoff - ユーザーが入力されます[こちら](http://stackoverflow.com/questions/11102358/how-to-pass-an-array-into-a-sql-server-stored-procedure) – MtwStark

答えて

1

可変数のパラメータを渡すのではなく、コンマで区切られた名前のリストを1つ送信し、格納されたproc内で分割関数を使用して名前の値を取り出して挿入します。その後、

CREATE PROC InsertData_To_TempTable 
@NameList VARCHAR(MAX) 
AS 
BEGIN 

    INSERT INTO #MyTempTable(Name) 
    SELECT Item 
    FROM dbo.SplitString(@NameList) 
END 

そして

EXEC InsertData_To_TempTable 'A,B,C' 

EXEC InsertData_To_TempTable 'A,B,C,D,E' 

を呼び出して何の作り付けのスプリット機能はので、ここではありませんが、より良い性能を持つ他のスプリットfucntion(whileループを用いない)があり、1 user defined function.

CREATE FUNCTION SplitString 
( 
     @Input NVARCHAR(MAX), 
     @Character CHAR(1) 
) 
RETURNS @Output TABLE (
     Item NVARCHAR(1000) 
) 
AS 
BEGIN 
     DECLARE @StartIndex INT, @EndIndex INT 

     SET @StartIndex = 1 
     IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character 
     BEGIN 
      SET @Input = @Input + @Character 
     END 

     WHILE CHARINDEX(@Character, @Input) > 0 
     BEGIN 
      SET @EndIndex = CHARINDEX(@Character, @Input) 

      INSERT INTO @Output(Item) 
      SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1) 

      SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input)) 
     END 

     RETURN 
END 
GO 

ですあなたはそれを検索することができます。 SQL Server 2016で分割機能が導入されました。 ここでは、パフォーマンス分析の優れたソースはvarious split functionsです。スプリット/解析機能なし

+0

あなたを確認して更新します。あなたのお返事ありがとう – balaji

+0

ありがとう、それは働いた! – balaji

2

ここでは、区切り文字としてを渡します|

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 
Return ( 
    Select RetSeq = Row_Number() over (Order By (Select null)) 
      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>'+ replace((Select @String as [*] For XML Path('')),@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',') 
+0

ありがとうございました。 – balaji

+0

@balajiハッピー・イズ・ヘルプ –

関連する問題