2

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

4

2 回答 2

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 , '','')
于 2013-10-13T11:17:57.043 回答
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
于 2013-10-13T11:35:12.960 回答