SQL 服务器中的动态 SQL

Dynamic SQL in SQL Server

我有一个 SQL CLR 存储过程 dbo.Parallel_AddSql,它采用 SQL 查询作为字符串参数执行。

看起来像这样:

exec dbo.Parallel_AddSql 'sql1', 
         'insert into test.dbo.table_1 values (1, ''test1'')'

我需要将我的 SQL 查询作为动态 SQL 语句传递给 Parallel_AddSql 过程。

SQL 我需要传递的语句是带有参数的过程执行语句,即

Exec dbo.MatchLastName @LastNameFromUser = @LastName,
 @checkbool = @checkbool 

我如何通过这个?因为 @lastName@checkbool 将超出范围,如果我在字符串中这样传递它们。

我试过用这个:

set @SQL = 'Exec dbo.MatchFirstName @FirstNameFromUser =' + @firstname + ', 
@checkbool = ' + cast(@checkbool as nvarchar(10))
exec dbo.Parallel_AddSql 'sql1', @SQL

但是,我得到这个错误:

Could not find stored procedure 'dbo.MatchFirstName'

dbo.MatchFirstName 在那里,但 dbo.Parallel_AddSql 根本看不到它。

dbo.Parallel_AddSql 即将提供给定的库代码 here

编辑:未闭合的引号错误:

set @SQL = 'Exec dbo.MatchFirstName @FirstNameFromUser =''' + @firstname
 + ''', @checkbool = ''' + cast(@checkbool as nvarchar(10))
set @SQL = 'Exec dbo.MatchFirstName @FirstNameFromUser =''' + @firstname + ''', ...'

如果你要在脚本中调用存储过程,你会写 Exec dbo.MatchFirstName @FirstNameFromUser = 'John',而不是 Exec dbo.MatchFirstName @FirstNameFromUser = John,对吗?您的动态 SQL 也是如此。您必须添加引号。

如果您想保留@FirstName = @FirstName 语法,您必须在字符串本身中声明和设置您的变量。所以,

'DECLARE @FirstName Varchar(Max); SET @FirstName = ''John''; EXEC ...'

编辑

如果您查看他们为 Parallel_AddSql 提供的示例,他们使用了过程的完全限定名称。

来自 www.codeproject.com 的示例:

exec ClrLibDb.dbo.Parallel_AddSql 'sql1', 'insert into test.dbo.table_1 values (1, ''test1'')'

我认为它需要数据库成为其中的一部分。所以,YourDbName.dbo.MatchFirstName。它可能正在查看 master 以查找您的存储过程,这就是它找不到它的原因。