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
有什么方法可以动态地在我的临时表中插入不同数量的名字吗?
没有Split / Parse功能
这里我们将分隔符作为|传递这可以是你喜欢的任何东西
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,< & >',',')
而不是传递可变数量的参数,发送一个逗号分隔的名称列表,并在存储过程中,使用拆分函数来检索名称值和插入。
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引入了split功能。这是various split functions性能分析的绝佳来源。