我遇到从具有单引号的存储过程执行SQL语句时出现问题。这是我正在执行的存储过程的查询。
EXEC('UPDATE myTABLE
SET myCOLUMN = (SELECT Replace('OSINGLEQUOTEJOHN DOE','SINGLEQUOTE','''')')
我正在尝试使用值“O'John Doe”更新表“myTABLE”列“myCOLUMN”
实际查询是这样的,我试图在上面的例子中简化它
EXEC('UPDATE myTABLE
SET myCOLUMN = (SELECT Replace('+ @IntegrationGuardian2FullName +','SINGLEQUOTE','''')')
@IntegrationGuardian2FullName
的值是“OSINGLEQUOTEJOHN DOE”。希望更有意义。
任何正文都可以帮我格式化这个查询吗?
答案 0 :(得分:21)
使用:
EXEC('UPDATE myTABLE
SET myCOLUMN = (SELECT REPLACE(''OSINGLEQUOTEJOHN DOE'',
''SINGLEQUOTE'',
''''''''))')
您提供的内容需要两个单引号围绕字符串,以及要替换的内容以及其他单引号,因为动态SQL需要单引号转义。
答案 1 :(得分:9)
你需要对引用的字符串中的单引号进行双重转义 - 所以使用两个单引号来包装字符串,以及四个(即两个转义引号),当查询时它们将被转义为一对单引号解析,然后再次取消转义到您实际要插入的单引号中:
EXEC('UPDATE myTable SET myColumn = ''John''''O Doe''')
答案 2 :(得分:2)
尽管OMG小马的回答非常完美并且对我有所帮助,但对我来说并不是很明显的事情是如何起作用的。 以下是我的理解,并可能帮助OP或任何仍在寻找的人适用于任何情况。
使用一个简单的例子
sp_change_users_login 'update_one', 'LName','Uname'
转化
select (' sp_change_users_login ''update_one '', ''LName '' ,''Uname '' ')
所有已完成的工作是as OMG Ponies said,将整个语句用单引号(')包装。 然后,对于已经存在的每个单引号('),在它之前再放一个(')。 我无法加粗在第二个语句中添加的单引号,以使其清晰可见。
答案 3 :(得分:1)
UPDATE myTABLE SET myCOLUMN='O''John Doe'
EXEC('UPDATE myTABLE SET myCOLUMN=''O''John Doe''')