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

时间:2013-11-08 12:07:01

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

我需要获取Table的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是Table的主键列的名称,pTableName是Table的名称。

现在,当Table_Name包含“'”字符时,我遇到了问题。(对于Ex.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'之后的未闭合引号。

那么,任何人都可以告诉我解决这个问题的最佳方法吗?

2 个答案:

答案 0 :(得分:2)

通过将单引号加倍来逃避单引号: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("'","''"))


修改 请注意,字符串替换现在仅在新的第三个替换字符串上 。 (我已经取出pPrimaryKey的字符串替换,并且第一次出现pTableName。)所以现在,单引号只会加倍,而它们将在其他单引号内。

答案 1 :(得分:0)