Sql-Server
openrowset 使用包含單引號的密碼連接到 SQL 伺服器
如果有辦法使用 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