当表名包含“'”时为 Sql Server 2008 构建动态查询

Posted

技术标签:

【中文标题】当表名包含“\'”时为 Sql Server 2008 构建动态查询【英文标题】:Building dynamic query for Sql Server 2008 when table name contains " ' "当表名包含“'”时为 Sql Server 2008 构建动态查询 【发布时间】:2013-11-08 12:07:00 【问题描述】:

我需要获取我正在为其构建动态查询的表的 TOP_PK、IDENT_CURRENT、IDENT_INCR、IDENT_SEED,如下所示:

sGetSchemaCommand = String.Format("SELECT (SELECT TOP 1 [0] FROM [1]) AS TOP_PK, IDENT_CURRENT('[1]') AS CURRENT_IDENT, IDENT_INCR('[1]') AS IDENT_ICREMENT, IDENT_SEED('[1]') AS IDENT_SEED", pPrimaryKey, pTableName)

这里pPrimaryKey是表的主键列名,pTableName是表名。

现在,当 Table_Name 包含“'”字符时,我遇到了问题。(例如 KIN'1)

当我使用上述逻辑并构建查询时,它将如下所示:

SELECT (SELECT TOP 1 [ID] FROM [KIL'1]) AS TOP_PK, IDENT_CURRENT('[KIL'1]') AS CURRENT_IDENT, IDENT_INCR('[KIL'1]') AS IDENT_ICREMENT, IDENT_SEED('[KIL'1]') AS IDENT_SEED

在这里,通过执行上述查询,我​​得到如下错误:

“1”附近的语法不正确。 字符串 ') AS IDENT_SEED' 后面的非闭合引号。

那么,谁能告诉我解决这个问题的最佳方法?

【问题讨论】:

尝试将要保留的单引号加倍。例如,KIL'1 变为 KIL''1IDENT_CURRENT('[KIL'1]') 变为 IDENT_CURRENT('[KIL''1]') 似乎类似于 SO 问题:***.com/questions/6764197/… @Doug_Ivison 如果有多个 ' 像 KIN''1 或 KIN'''1 我需要再插入一个 ' 吗? 每个 ' 都需要替换为 ''。 对于KIN''1,它仍然加倍:KIN''''1。我认为我下面的示例代码(假设您正在为 .NET 编写代码)可以处理这个问题。 【参考方案1】:

将单引号翻倍:KIL'1 变为 KIL''1

如果一个字符串已经有相邻的单引号,两个变成四个,或者四个变成八个......它可能有点难以阅读,但它有效:)

使用 .NET 中的字符串方法,您的语句可能是:

sGetSchemaCommand = String.Format("SELECT (SELECT TOP 1 [0] FROM [1]) AS TOP_PK, IDENT_CURRENT('[2]') AS CURRENT_IDENT, IDENT_INCR('[2]') AS IDENT_ICREMENT, IDENT_SEED('[2]') AS IDENT_SEED", pPrimaryKey, pTableName, pTableName.Replace("'","''"))

编辑: 请注意,字符串替换现在 only 在新的第三个替换字符串上。 (我已经为 pPrimaryKey 和第一次出现的 pTableName 删除了字符串替换。)所以现在,当单引号在其他单引号内时,它们只会加倍。

【讨论】:

【参考方案2】:

你需要将每一个单引号替换成两个单引号http://beyondrelational.com/modules/2/blogs/70/posts/10827/understanding-single-quotes.aspx

【讨论】:

以上是关于当表名包含“'”时为 Sql Server 2008 构建动态查询的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中怎么把查询出来的字段数据当表名再进行查询?

如何在 SQL Server 触发器函数中获取表名? [关闭]

使用 sysobjects 表中的表名创建 Sql Server 视图

当表在不同的架构中时,如何从 SQL Server 导入所有带有 sqoop 的表?

sql server 2008 数据库图表 表名搜索

sql server 一个简单的存储过程