How to use Pass comma separated string in dynamic

2020-04-15 11:24发布

I have a function which will return integer values from comma delimited string , It takes two parameters (@string nvarchar(4000), @delimiter char(1)). So the problem is if I am using this function inside a dynamic query I am getting error , here is query

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)

I am getting error Procedure or function dbo.fnDelimitedStringToTable has too many arguments specified.

2条回答
做自己的国王
2楼-- · 2020-04-15 11:55

Use sp_executesql instead. In this case you can pass arguments as parameters.

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
查看更多
forever°为你锁心
3楼-- · 2020-04-15 12:08

When you build a dynamic SQL like that, you need to wrap your parameter in double quote ''

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)

This way the SQL statement will be:

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

and not:

SELECT val FROM dbo.[fnDelimitedStringToTable](1,2,3,4 , '','')
查看更多
登录 后发表回答