sql-server - 创建返回表的函数不起作用语法错误?SQL
问题描述
您好,我需要发出一个 sql 请求,该请求在“WHERE(abc IN @par1,@par2 ...”)中接受多个参数。为此,我找到了一些使用 sql 函数的解决方案。我尝试在没有任何参数的情况下使用它成功。我正在工作台上工作,这是我的功能代码。
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;
它会导致“@TempTab”出现问题。
感谢帮助。
解决方案
首先 - 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
也就是说 - ^^^ 这将非常缓慢。对于您正在做的事情,您可以使用STRING_SPLIT。
DECLARE @instr VARCHAR(8000) = 'abc,,xxx,yyy,,z';
SELECT split.* FROM STRING_SPLIT(@instr,',') AS split WHERE split.[value] > '';
完毕。更好的是,您可以有任意数量的逗号,它们将被视为一个。请注意以下更改:
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 大约快一百倍,并且启动的代码要少得多。
推荐阅读
- php - Laravel 回显服务器不返回任何内容
- matlab - 如何在Matlab中绘制两个图像的相关性
- file - 为什么文件中的就地替换如此困难?
- java - 我收到异常 java.util.LinkedHashMap cannot be cast to java.util.List on console
- windows-services - 如何在 Azure Service Fabric 中运行 Windows 服务?
- facebook - 预填 Facebook Messenger 消息或发送到群组
- docker - 如何使用 docker 镜像在 heroku 上部署 Asp.net core 2.2 应用程序并避免 Dockerfile 错误
- google-chrome - 有没有办法在网络选项卡中默认设置过滤器值 - Google Chrome 开发者工具
- docker - 我可以通过 docker-compose.yml 文件将服务部署到 docker swarm,该文件通过其 ID 引用图像吗?
- go - 自定义控制器在缓存同步之前对 addfunc 事件处理程序做出反应?这种行为正确吗?