带有@variable服务器名称的存储过程

时间:2014-01-28 22:13:27

标签: sql sql-server tsql sql-server-2012

我正在尝试创建一个新的存储过程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
.
.
.

此方案的解决方法是什么?

1 个答案:

答案 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)