2016-12-30 150 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

或者發送你的價值觀逗號分隔或考慮增加一個*用戶 - 定義表類型*作爲你的proc中的參數 – Stephen

+0

如何使用'insert'而不是存儲過程? –

+0

查看詳細答案[here](http://stackoverflow.com/questions/11102358/how-to-pass-an-array-into-a-sql-server-stored-procedure) – MtwStark

回答

1

不是傳遞可變數量的參數,而是發送單個逗號分隔的名稱列表並在存儲過程中使用分割函數檢索名稱值並插入。

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' 

有沒有內在的分裂功能,所以這裏是一個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 

還有其他分裂溫控功能具有更好的性能(沒有用while循環)你可以搜索。 SQL Server 2016引入了分割功能。 這是various split functions性能分析的極好來源。

+0

將檢查並更新你。感謝您的回答 – balaji

+0

感謝它的工作! – balaji

2

如果沒有分流/解析功能

下面我們通過分隔符爲|它可以是任何你喜歡

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) 

分流/解析功能

Declare @Names varchar(max) = 'Smith, John|Williams, Bill' 

Insert Into #MyTempTable(Name) 
Select RetVal from [dbo].[udf-Str-Parse] (@Names,'|') 

的UDF如果需要

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對它有幫助 –