如何在 SQL 的动态查询中使用 Pass 逗号分隔的字符串

Posted

技术标签:

【中文标题】如何在 SQL 的动态查询中使用 Pass 逗号分隔的字符串【英文标题】:How to use Pass comma separated string in dynamic query in SQL 【发布时间】:2013-10-13 11:12:27 【问题描述】:

我有一个函数,它将从逗号分隔的字符串返回整数值,它需要两个参数(@string nvarchar(4000)、@delimiter char(1))。所以问题是如果我在动态查询中使用这个函数我会出错,这里是查询

declare @ProductIDs varchar(11)
declare @SQL varchar(max)

set @ProductIDs='1,2,3,4'
declare @query varchar(max)
--set @query= @ProductIDs +','+@Delimiter

SELECT @SQL = 'SELECT val FROM dbo.[fnDelimitedStringToTable]('+ @ProductIDs +' , '','')'

Exec(@SQL)

我收到错误过程或函数 dbo.fnDelimitedStringToTable 指定了太多参数。

【问题讨论】:

【参考方案1】:

当您构建这样的动态 SQL 时,您需要将参数用双引号 '' 括起来

declare @ProductIDs varchar(11)
declare @SQL varchar(max)

set @ProductIDs='1,2,3,4'
declare @query varchar(max)
--set @query= @ProductIDs +','+@Delimiter

SELECT @SQL = 'SELECT val FROM dbo.[fnDelimitedStringToTable]('''+ @ProductIDs +''' , '','')'

Exec(@SQL)

这样 SQL 语句将是:

SELECT val FROM dbo.[fnDelimitedStringToTable]('1,2,3,4' , '','')

而不是:

SELECT val FROM dbo.[fnDelimitedStringToTable](1,2,3,4 , '','')

【讨论】:

感谢您在代码中进行更正,我在传递参数时错过了 '' 。非常感谢,你拯救了我的周末:-)【参考方案2】:

请改用sp_executesql。在这种情况下,您可以将参数作为参数传递。

DECLARE @SQL nvarchar(max)
DECLARE @ParmDef nvarchar(1000)

DECLARE @ArgProductIDs nvarchar(100)
DECLARE @Arg2 nvarchar(100)
DECLARE @Arg3 nvarchar(100)

SET @SQL = N'SELECT val
             FROM dbo.[fnDelimitedStringToTable](@ProductIDs, @Param2, @Param3)';

SET @ParmDef = N'@ProductIDs nvarchar(100),
                 @Param2 nvarchar(100),
                 @Param3 nvarchar(100)';

SET @Arg1 = N'1,2,3,4';
SET @Arg2 = N'';
SET @Arg3 = N'';

EXEC sp_executesql @SQL, @ParmDef, 
      @ProductIDs = @ArgProductIDs, @Param2 = @Arg2, , @Param3 = @Arg3

【讨论】:

以上是关于如何在 SQL 的动态查询中使用 Pass 逗号分隔的字符串的主要内容,如果未能解决你的问题,请参考以下文章

关于sqlserver 的一个查询, 解决再加50分

如何使用 SQL 查询创建逗号分隔的列表?

如何使用 Pass-through 查询从 MS Access 前端向 sql 表输入数据?

如何在连接到 MS SQL 服务器的 MS Access“Pass Trough”查询中使用组合框输入正确编写 WHERE 语句

sql子查询(急100分)

如何将 PHP 逗号分隔的字符串集成到 SQL 查询中?