我正在尝试创建一个新的存储过程sp_sync_table
(在SQL Server 2012中),它接受一个参数(链接服务器名称)。但是,声明@linkedServerName
变量的jut是不够的。 CREATE PROCEDURE
指令失败,因为它无法解析@linkedServerName
,除非@linkedServerName
SET 为特定名称。
失败并显示错误:
Msg 102,Level 15,State 1,Procedure sp_sync_table,Line 31
'。'附近的语法不正确。)
显然我无法提供必须通过
传递的特定名称exec sp_sync_table server_name
这是失败的部分:
CREATE PROCEDURE sp_sync_table
@linkedServerName AS VARCHAR(50)
AS BEGIN
.
.
.
DECLARE cursorX CURSOR FOR
SELECT col1, col2, col3, col4 FROM @linkedServerName.[db-name].[dbo].[table]
OPEN cursorX
.
.
.
此方案的解决方法是什么?
答案 0 :(得分:1)
你能使用动态sql吗?我知道这不是安全的方法,但您可以将查询放在字符串中并执行字符串。只需要非常小心用户为@linkedServerName传入的内容。显然,您将执行允许用户输入的任何内容。不知道这对于光标是如何工作的 - 我从未尝试过。
CREATE PROCEDURE sp_sync_table
@linkedServerName AS VARCHAR(50)
AS BEGIN
.
.
.
DECLARE queryToExecute varchar(max)
select queryToExecute = 'DECLARE cursorX CURSOR FOR'
select queryToExecute = queryToExecute + 'SELECT col1, col2, col3, col4 FROM'
select queryToExecute = queryToExecute + ' ' + @linkedServerName + '.[db-name].[dbo].[table]'
select queryToExecute = queryToExecute + 'OPEN cursorX...'
exec(queryToExecute)