0

リンクサーバー(SQL 2000/2005)でテーブルを更新しようとしていますが、サーバー名が事前にわかりません。私はこれを試しています:

DECLARE @Sql NVARCHAR(4000)
DECLARE @ParamDef NVARCHAR(4000)
DECLARE @SERVER_NAME VARCHAR(35)

SET @Sql = 'UPDATE
@server_name_param.dba_sandbox.dbo.SomeTable
SET SomeCol=''data'''

SET @ParamDef = N'@server_name_param VARCHAR(35)'

print @Sql

exec sp_executesql @Sql, @ParamDef, @server_name_param=@SERVER_NAME

これはこれを返します:

UPDATE
@server_name_param.dba_sandbox.dbo.SomeTable
SET SomeCol='data'
Msg 170, Level 15, State 1, Line 2
Line 2: Incorrect syntax near '.'.

何か案は?とにかく、パラメーターがバインドされた後に実行されているSQLステートメントを表示しますか?

4

3 に答える 3

4

これを行う必要があります、パラメータ化することはできません

....
SET @Sql = 'UPDATE ' + @server_name_param + '.dba_sandbox.dbo.SomeTable SET SomeCol=''data'''
....

編集:私が純粋なDBAの時代に使用した別の方法があります

EXEC sp_setnetname 'AdhocServer', @SERVER_NAME
UPDATE AdhocServer.dba_sandbox.dbo.SomeTable SET SomeCol 'data'
EXEC sp_setnetname 'AdhocServer', 'MeaninglessValue'

sp_setnetnameSQLServer2000から2008までありますか

編集2。権限

EXECUTE AS LOGIN = 'login_name'login_nameがスーパーユーザーである、を試してください

私は実際にはこれを使用していません(テストには「ASUSER」を使用しています)ので、細かい点がわかりません...

編集3:並行性については、sp_getapplockとストアドプロシージャ、またはその他の並行性制御メカニズムの使用を検討してください。

于 2009-11-18T20:09:59.023 に答える
0

パラメータを使用してこれを直接行うことはできません。動的SQLを使用するか、動的SQLを実行するSPにパラメータとしてサーバー名を送信する必要があります。

DECLARE @template NVARCHAR(4000) 
DECLARE @Sql NVARCHAR(4000) 
DECLARE @SERVER_NAME VARCHAR(35) 

SET @template = 'UPDATE {@server_name_param}.dba_sandbox.dbo.SomeTable SET SomeCol=''data''' 
SET @sql = REPLACE(@template, '{@server_name_param}', @SERVER_NAME)

print @Sql 

exec sp_executesql @Sql -- OR EXEC ( @sql )
于 2009-11-18T20:08:54.603 に答える
0

私はgbnのトリックが好きです。私はそれを知りませんでした、そして私はそれをもう少し研究しなければならないでしょう。

私はそのトリックを知らなかったので、過去に同様の状況で動的SQLを使用する必要がありました(Cadeが投稿したものなど)。その場合、通常は情報スキーマビューにクエリを実行して、クエリを作成する前にパラメータ値が実際のデータベースオブジェクトであることを確認します。そうすれば、それは注射の試みではないと確信しています。

于 2009-11-18T20:27:46.657 に答える