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

时间:2013-10-13 11:12:28

标签: sql sql-server sql-server-2008

我有一个函数,它将从逗号分隔的字符串返回整数值,它需要两个参数(@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指定了太多参数。

2 个答案:

答案 0 :(得分: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 , '','')

答案 1 :(得分:0)

请改用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