1

T-SQLのOPENROWSET()関数の奇妙な属性の1つは、リモートで実行される「クエリ」内のパラメータを受け入れることができないことです。これを回避するには、OPENROWSET呼び出しとパラメーター化されたクエリを含む長い文字列を作成する必要があると思います。

この制限を考慮して、私はこのコードを機能させようとしています。

Declare @DataId int
Declare @RecordType varchar(50)
Declare @Filter varchar(50)

 -- ...

SELECT TOP 1 
    @RecordType = recordType,
    @DataId = DataId
FROM OPENROWSET('SQLNCLI', 
                'Server=MyServer;Trusted_Connection=yes;',
                'SELECT recordType, DataId FROM MyDb..data_lookup
                 WHERE Filter = ''' + @Filter+'''')

これはエラーをスローします

'+'の近くの構文が正しくありません

現在、OPENROWSETの制限を考えると、これは理にかなっています。しかし、これをSQL文字列に変換すると、クエリの結果から設定する機能が失われません@RecordType@DataId

制限を回避し、これを希望どおりに機能させるために、これに糖衣構文を振りかけることができるものはありますか?

4

2 に答える 2

1

文字列を動的に構築する例を次に示します。

http://support.microsoft.com/kb/314520

最初にテーブル変数に挿入してから、そこから値を取得できます。

DECLARE @t TABLE (DataID int, RecordType varchar(50))
INSERT INTO @t
exec sp_executeSQL N'your OPENROWSERT query'

SELECT TOP 1 @DataID = DataID, @RecordType = RecordType
FROM @t
于 2013-01-22T23:48:31.473 に答える
0

@Stuartのおかげで、私がついに使用したコードは次のとおりです。

Declare @DataId int
Declare @RecordType varchar(50)
Declare @Filter varchar(50)

Declare @query nvarchar(4000)
 -- ...

select @query = N'select top 1 recordType, DataId
                 from openrowset(''SQLNCLI'', 
                                 ''Server=MyServer;Trusted_Connection=yes;'',
                                 ''SELECT recordType, DataId from MyDb..data_lookup
                                  where Filter = ''''' + @Filter+''''''')'
declare @t TABLE (recordType varchar(2), DataId int)

insert into @t
exec sp_executeSQL @Query

select top 1 @RecordType = recordType, @DataId = DataId
from @t
于 2013-01-23T17:21:13.453 に答える