如何在 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 逗号分隔的字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Pass-through 查询从 MS Access 前端向 sql 表输入数据?
如何在连接到 MS SQL 服务器的 MS Access“Pass Trough”查询中使用组合框输入正确编写 WHERE 语句