如果有一种方法可以使用 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
并查看其实际设置的情况之一......您可以在上面的打印结果中看到(取自解决方案 1,尽管 2 相同),您没有转义连接字符串中的单引号,因此在 'C' 之前结束字符串并在 ' 之前再次开始&'。
在“C”之前和“&”之后,您需要额外的双引号。
这给出了以下字符串,它现在应该具有所需的单引号转义,并且应该可以正常工作。