在 T-SQL 中即时转义单引号
Escape single quotes on the fly in T-SQL
有没有办法即时转义单引号,而不必用两个单引号转义每次出现的单引号?
我正在寻找等同于 PL/SQL 的引用文字 q'[这是 PL SQL 的引用文字]'[=11= 的 T-SQL ]
只是为了将来澄清 viewers/readers...
遗留的 XSL 样式表到处都是单引号和双引号,它也存储在数据库中。每次对此样式表进行更改时,它也需要在存储它的数据库列中更新。
虽然我同意很容易找到所有出现的单引号并将其替换为两个单引号,并且 insert/update 将 xml 值作为字符串,这是迄今为止的做法.必须完成两个版本,样式表脚本和样式表本身。
我一直在寻找更好的解决方案。
@Charlieface 的解决方案符合我的要求
当您从 xml 读取时,您应该能够转换为 VARCHAR 数据类型并插入,相应地进行更新。
示例代码如下:
DECLARE @table table(quotedstring varchar(100))
DECLARE @xml xml =
'<root><t>this is PL SQL's quoted literal</t><t>this is second PL SQL's quoted literal</t></root>'
insert into @table
select t.value('t[1]','varchar(100)') as qstring from @xml.nodes('root') as x(t)
UPDATE @table
SET quotedstring = (SELECT t.value('t[2]','varchar(100)') from @xml.nodes('root') as x(t))
SELECT * from @table
quotedstring
this is second PL SQL's quoted literal
在 T-SQL 中,您可以将两件单层外套放在一起,以排除单层外套(没有双层外套)。
例如:
'this is PL SQL's quoted literal'
应更改如下:
'this is PL SQL''s quoted literal'
要转义 XML,您通常可以使用文本编辑器将 '
替换为 ''
,尽管我只会在将一个小的简单上传作为一个-关闭,在那里我可以检查没有其他语法问题。 不要以编程方式执行此操作,尤其是当您的数据不受信任时。
您应该将代码和数据分开。这意味着您不需要转义任何内容,因为数据不会作为代码的一部分进行解析。
您可以为此使用变量或参数。从客户端应用程序调用过程时,使用传入 XML 的参数。例如
CREATE OR ALTER PROCEDURE InsertXML
@xmlData xml
AS
INSERT SomeTable(XmlData)
VALUES (@xmlData);
如果您需要以编程方式执行此操作并希望从文件加载它,您可以使用 OPENROWSET (BULK
,例如
INSERT SomeTable(XMLData)
SELECT CONVERT(XML, BulkColumn)
FROM OPENROWSET(BULK 'C:\YourXML.xml', SINGLE_BLOB) AS x;
文件需要在服务器上,而不是客户端上。
您还可以使用各种工具加载文件。
有没有办法即时转义单引号,而不必用两个单引号转义每次出现的单引号?
我正在寻找等同于 PL/SQL 的引用文字 q'[这是 PL SQL 的引用文字]'[=11= 的 T-SQL ]
只是为了将来澄清 viewers/readers...
遗留的 XSL 样式表到处都是单引号和双引号,它也存储在数据库中。每次对此样式表进行更改时,它也需要在存储它的数据库列中更新。
虽然我同意很容易找到所有出现的单引号并将其替换为两个单引号,并且 insert/update 将 xml 值作为字符串,这是迄今为止的做法.必须完成两个版本,样式表脚本和样式表本身。
我一直在寻找更好的解决方案。
@Charlieface 的解决方案符合我的要求
当您从 xml 读取时,您应该能够转换为 VARCHAR 数据类型并插入,相应地进行更新。
示例代码如下:
DECLARE @table table(quotedstring varchar(100))
DECLARE @xml xml =
'<root><t>this is PL SQL's quoted literal</t><t>this is second PL SQL's quoted literal</t></root>'
insert into @table
select t.value('t[1]','varchar(100)') as qstring from @xml.nodes('root') as x(t)
UPDATE @table
SET quotedstring = (SELECT t.value('t[2]','varchar(100)') from @xml.nodes('root') as x(t))
SELECT * from @table
quotedstring |
---|
this is second PL SQL's quoted literal |
在 T-SQL 中,您可以将两件单层外套放在一起,以排除单层外套(没有双层外套)。
例如:
'this is PL SQL's quoted literal'
应更改如下:
'this is PL SQL''s quoted literal'
要转义 XML,您通常可以使用文本编辑器将 '
替换为 ''
,尽管我只会在将一个小的简单上传作为一个-关闭,在那里我可以检查没有其他语法问题。 不要以编程方式执行此操作,尤其是当您的数据不受信任时。
您应该将代码和数据分开。这意味着您不需要转义任何内容,因为数据不会作为代码的一部分进行解析。
您可以为此使用变量或参数。从客户端应用程序调用过程时,使用传入 XML 的参数。例如
CREATE OR ALTER PROCEDURE InsertXML
@xmlData xml
AS
INSERT SomeTable(XmlData)
VALUES (@xmlData);
如果您需要以编程方式执行此操作并希望从文件加载它,您可以使用 OPENROWSET (BULK
,例如
INSERT SomeTable(XMLData)
SELECT CONVERT(XML, BulkColumn)
FROM OPENROWSET(BULK 'C:\YourXML.xml', SINGLE_BLOB) AS x;
文件需要在服务器上,而不是客户端上。
您还可以使用各种工具加载文件。