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
以查找您的存储过程,这就是它找不到它的原因。
我有一个 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
以查找您的存储过程,这就是它找不到它的原因。