パスワード文字列に「一重引用符」が含まれる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つです@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