Sql server 创建返回表不';t工作语法错误?SQL
您好,我需要发出一个sql请求,该请求在“WHERE(abc in@par1,@par2…”中接受多个参数 为此,我找到了一些使用sql函数的解决方案。我试图使用它,但没有成功。 我正在工作台上工作,这是我的功能代码Sql server 创建返回表不';t工作语法错误?SQL,sql-server,tsql,set-returning-functions,Sql Server,Tsql,Set Returning Functions,您好,我需要发出一个sql请求,该请求在“WHERE(abc in@par1,@par2…”中接受多个参数 为此,我找到了一些使用sql函数的解决方案。我试图使用它,但没有成功。 我正在工作台上工作,这是我的功能代码 CREATE function MultiStringToTable (InStr VARCHAR(255)) RETURNS @TempTab TABLE( id nvarchar(255) not null ) AS BEGIN -- Ensu
CREATE function MultiStringToTable (InStr VARCHAR(255))
RETURNS @TempTab TABLE(
id nvarchar(255) not null
)
AS
BEGIN
-- Ensure input ends with comma
SET @InStr = REPLACE(@InStr + ',', ',,', ',');
DECLARE @SP INT;
DECLARE @VALEUR VARCHAR(1000);
WHILE PATINDEX('%,%', @INSTR ) <> 0
SET @SP = PATINDEX('%,%',@INSTR);
SET @VALEUR = LEFT(@INSTR , @SP - 1);
SET @INSTR = STUFF(@INSTR, 1, @SP, '');
INSERT INTO @TempTab(id) VALUES (@VALEUR);
END;
RETURN;
end;
CREATE function MultiStringToTable(InStr VARCHAR(255))
返回@testab表(
id nvarchar(255)不为空
)
像
开始
--确保输入以逗号结尾
设置@InStr=REPLACE(@InStr+'、'、'、'、'和');
声明@SP INT;
宣布@VALEUR VARCHAR(1000);
而PATINDEX('%,%',@INSTR)0
设置@SP=PATINDEX(“%,%”,@INSTR);
设置@VALEUR=左(@INSTR,@SP-1);
设置@INSTR=STUFF(@INSTR,1,@SP,);
在@TELTAB(id)值(@VALEUR)中插入;
终止
回来
终止
它会导致“@testab”出现问题
谢谢你的帮助
CREATE function MultiStringToTable (@InStr VARCHAR(255))
RETURNS @TempTab TABLE(
id nvarchar(255) not null
)
AS
BEGIN
-- Ensure input ends with comma
SET @InStr = REPLACE(@InStr + ',', ',,', ',');
DECLARE @SP INT;
DECLARE @VALEUR VARCHAR(1000);
WHILE PATINDEX('%,%', @INSTR ) <> 0
BEGIN
SET @SP = PATINDEX('%,%',@INSTR);
SET @VALEUR = LEFT(@INSTR , @SP - 1);
SET @INSTR = STUFF(@INSTR, 1, @SP, '');
INSERT INTO @TempTab(id) VALUES (@VALEUR);
END;
RETURN;
end;
CREATE function MultiStringToTable(@InStr VARCHAR(255))
返回@testab表(
id nvarchar(255)不为空
)
像
开始
--确保输入以逗号结尾
设置@InStr=REPLACE(@InStr+'、'、'、'、'和');
声明@SP INT;
宣布@VALEUR VARCHAR(1000);
而PATINDEX('%,%',@INSTR)0
开始
设置@SP=PATINDEX(“%,%”,@INSTR);
设置@VALEUR=左(@INSTR,@SP-1);
设置@INSTR=STUFF(@INSTR,1,@SP,);
在@TELTAB(id)值(@VALEUR)中插入;
终止
回来
终止
首先-Artem抢先一步,但正确的代码是:
CREATE function MultiStringToTable (@InStr VARCHAR(255))
RETURNS @TempTab TABLE(id nvarchar(255) not null)
AS
BEGIN
-- Ensure input ends with comma
SET @InStr = REPLACE(@InStr + ',', ',,', ',');
DECLARE @SP INT;
DECLARE @VALEUR VARCHAR(1000);
WHILE PATINDEX('%,%', @INSTR ) <> 0
BEGIN
SET @SP = PATINDEX('%,%',@INSTR);
SET @VALEUR = LEFT(@INSTR , @SP - 1);
SET @INSTR = STUFF(@INSTR, 1, @SP, '');
INSERT INTO @TempTab(id) VALUES (@VALEUR);
END;
RETURN;
END;
GO
完成。更好的是,您可以有任意数量的逗号,它们将被视为一个。请注意以下更改:
DECLARE @instr VARCHAR(8000) = 'abc,,,,xxx,,yyy,,z,w,,,,sss,,';
这将返回:
value
----------
abc
xxx
yyy
z
w
sss
为了了解性能差异,让我们做一个快速测试
PRINT CHAR(10)+'STRING_SPLIT'+CHAR(10)+REPLICATE('-',90);
GO
DECLARE @st DATETIME = GETDATE(), @x VARCHAR(8000);
SELECT @x = split.[value]
FROM #strings AS s
CROSS APPLY STRING_SPLIT(s.String,',') AS split
WHERE split.[value] > ''
PRINT DATEDIFF(MS,@st,GETDATE());
GO 3
PRINT CHAR(10)+'dbo.MultiStringToTable'+CHAR(10)+REPLICATE('-',90);
GO
DECLARE @st DATETIME = GETDATE(), @x VARCHAR(8000);
SELECT @x = split.id
FROM #strings AS s
CROSS APPLY dbo.MultiStringToTable(s.String) AS split
WHERE split.id > '';
PRINT DATEDIFF(MS,@st,GETDATE());
GO 3
STRING_SPLIT
--------------------------------------------------------------------------------------
Beginning execution loop
140
184
153
Batch execution completed 3 times.
dbo.MultiStringToTable
--------------------------------------------------------------------------------------
Beginning execution loop
14046
14174
14466
Batch execution completed 3 times.
STRING_SPLIT的速度大约是100倍,启动代码也少得多。停止再发明轮子。通过简单的搜索可以找到许多编写良好的拆分器函数。或者更好:使用表值参数
PRINT CHAR(10)+'STRING_SPLIT'+CHAR(10)+REPLICATE('-',90);
GO
DECLARE @st DATETIME = GETDATE(), @x VARCHAR(8000);
SELECT @x = split.[value]
FROM #strings AS s
CROSS APPLY STRING_SPLIT(s.String,',') AS split
WHERE split.[value] > ''
PRINT DATEDIFF(MS,@st,GETDATE());
GO 3
PRINT CHAR(10)+'dbo.MultiStringToTable'+CHAR(10)+REPLICATE('-',90);
GO
DECLARE @st DATETIME = GETDATE(), @x VARCHAR(8000);
SELECT @x = split.id
FROM #strings AS s
CROSS APPLY dbo.MultiStringToTable(s.String) AS split
WHERE split.id > '';
PRINT DATEDIFF(MS,@st,GETDATE());
GO 3
STRING_SPLIT
--------------------------------------------------------------------------------------
Beginning execution loop
140
184
153
Batch execution completed 3 times.
dbo.MultiStringToTable
--------------------------------------------------------------------------------------
Beginning execution loop
14046
14174
14466
Batch execution completed 3 times.