【问题标题】: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 问题:stackoverflow.com/questions/6764197/…
  • @Doug_Ivison 如果有多个 ' 像 KIN''1 或 KIN'''1 我需要再插入一个 ' 吗?
  • 每个 ' 都需要替换为 ''。
  • 对于KIN''1,它仍然加倍:KIN''''1。我认为我下面的示例代码(假设您正在为 .NET 编写代码)可以处理这个问题。

标签: sql-server vb.net sql-server-2008


【解决方案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】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 2011-08-26
      • 1970-01-01
      • 2018-06-09
      相关资源
      最近更新 更多