2014-01-28 213 views
0

存储过程我想创建一个新的存储过程sp_sync_table(在SQL Server 2012),它接受一个参数(链接服务器名称)。然而,突出声明@linkedServerName变量是不够的。 CREATE PROCEDURE指令失败,因为它无法解析@linkedServerName,除非@linkedServerNameSET为特定名称。与@variable服务器名称

它失败,错误:

Msg 102, Level 15, State 1, Procedure sp_sync_table, Line 31
Incorrect syntax near '.'.)

很明显,我不能提供一个特定的名称,必须要通过

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 
. 
. 
. 

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

+2

我认为动态SQL将是你唯一的选择 – jazza1000

+0

好了,不知道你是游标里面做什么,但有可能在连接服务器创建此过程,只是远程调用的程序,而不是试图在调用方的动态SQL中将所有这一切混为一谈? –

+0

..这太容易了(链接的服务器不是我的),所以很不幸:) – Milan

回答

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) 
+0

我试过这个(类似的exec语句),但没有运气。我只是试过你的版本(上面),它会抛出col1,col2,col3不存在的错误......任何想法?这是否只适用于较旧的SQL? – Milan

+0

你真的有一个名为linkedServerName的列吗?[db-name]。[dbo]。[table]。[Col1]?名为db-name的模式和名为table的表有点不同寻常。较旧的SQL通常适用于较新的版本,这在这里不是问题。 – Twelfth

+0

我建议你使用动态SQL来获取数据到一个loca临时表中,然后你的光标就会移到你的光标上 - 维护起来会更简单,并且可能更快(depdning多少远程记录) –