web-dev-qa-db-ja.com

単一引用符を含むパスワードでSQLサーバーに接続するためのopenrowset

パスワード文字列に「一重引用符」が含まれるSQL認証済みアカウントでopenrowsetを使用してAzure SQLデータベースにクエリを実行する方法がある場合、誰かが私を助けてくれますか?私の声明は以下のようになります

(オンプレミスからAzureデータベースにクエリを実行しています)

SELECT a.*  
FROM OPENROWSET('SQLNCLI11', 'SERVER=sqlserver.database.windows.net,1433;DATABASE=testDB;Uid=admin;Pwd=Fj'C(D=JJ&'XE6vx};','select * from table1 with (nolock)')a

以下の解決策を試しました

ソリューション1-動的SQL

declare @string varchar(max)
set @string=
'SELECT a.*  
FROM OPENROWSET(''SQLNCLI11'', ''SERVER=sqlserver.database.windows.net,1433;DATABASE=testDB;Uid=admin;Pwd="Fj'''+'C(D=JJ&'''+'XE6vx}";'',''select count(*) from dbo.table1 with (nolock)'')a'

exec (@string)

解決策2-パラメータとしてパスワードを渡す

declare @string varchar(max)
declare @pwd varchar(max)
set @pwd = 'Fj'''+'C(D=JJ&'''+'XE6vx}'
set @string=
'SELECT a.*  
FROM OPENROWSET(''SQLNCLI11'', ''SERVER=sqlserver.database.windows.net,1433;DATABASE=testDB;Uid=admin;Pwd='+@pwd+';'',''select count(*) from dbo.table1 with (nolock)'')a'

exec (@string)

それらはすべて非常に同じエラーになります(パスワードを指す)

メッセージ102、レベル15、状態1、行16「C」付近の構文が正しくありません。

パスワードに「一重引用符」を付けずにSQL認証アカウントを使用すると、まったく問題なく動作します。

この問題を修正するためにパスワードを簡単に変更することができましたが、それでも解決策があるかどうか知りたいです。

1
Midhun C N

これは間違いなく、あなたが印刷する必要があるそれらの機会の1つです@stringと実際の設定を確認してください...

SELECT a.*  
FROM OPENROWSET('SQLNCLI11', 'SERVER=sqlserver.database.windows.net,1433;DATABASE=testDB;Uid=admin;Pwd="Fj'C(D=JJ&'XE6vx}";','select count(*) from dbo.table1 with (nolock)')a

上記の印刷された結果(ソリューション1から取得したものですが、2は同じです)を見ると、接続文字列で一重引用符がエスケープされていないため、「C」の前で文字列が終了し、「 '」の前で再び開始されていることがわかります& '。

「C」の前と「&」の後に追加の二重引用符のセットが必要です。

declare @string varchar(max);
declare @pwd varchar(max);
set @pwd = 'Fj'''+'''C(D=JJ&'''''+'XE6vx}';
set @string=
'SELECT a.*  
FROM OPENROWSET(''SQLNCLI11'', ''SERVER=sqlserver.database.windows.net,1433;DATABASE=testDB;Uid=admin;Pwd='+@pwd+';'',''select count(*) from dbo.table1 with (nolock)'')a'

これにより、次の文字列が得られます。これは、一重引用符をエスケープする必要があるため、うまく機能するはずです。

SELECT a.*    
FROM OPENROWSET('SQLNCLI11', 'SERVER=sqlserver.database.windows.net,1433;DATABASE=testDB;Uid=admin;Pwd=Fj''C(D=JJ&''XE6vx};','select count(*) from dbo.table1 with (nolock)')a
3
Mark Sinkinson