Sql-Server

openrowset 使用包含單引號的密碼連接到 SQL 伺服器

  • January 18, 2018

如果有辦法使用 openrowset 查詢 Azure SQL 數據庫,有人可以幫助我,並且 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 身份驗證帳戶絕對可以正常工作。

我可以輕鬆更改密碼以解決此問題,但仍然想知道是否有解決此問題的方法。

這絕對是您應該列印出來@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

引用自:https://dba.stackexchange.com/questions/195662