通过参数传递列名时删除引号

时间:2018-08-30 22:03:28

标签: sql sql-server

嗨,我正在尝试执行以下操作:

 SELECT @IDENTITY_COLUMN = (
  SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = 'tbltest1'


SELECT @LAST_VALUE_USED = (
SELECT ISNULL(MAX(@IDENTITY_COLUMN),0)
FROM tbltest1
)

如果没有行,则工作正常,但是当有行时,第二个查询返回的是具有列名的字符串,我相信这是因为@IDENTITY_COLUMN中带有引号。因此,我得到Conversion failed when converting the nvarchar value 'columnname' to data type int。我该如何解决这个问题?

帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

我认为您正在尝试从表中获取IDENTITY列的最大值(如果存在这样的列)。为此,您需要动态SQL。像这样:

DECLARE @identity_column sysname;
DECLARE @query nvarchar(MAX);

SET @identity_column = (SELECT column_name
                               FROM information_schema.columns
                                    WHERE table_name = 'tbltest1');
IF @identity_column IS NOT NULL
BEGIN
  SET @query = '
SELECT isnull(max(' + quotename(@identity_column) + '), 0)
       FROM tbltest1;
';
  EXECUTE (@query);
END;

注意:

  • 对于对象名称,请使用sysname,这是它们的另一种类型。请勿使用varcharnavarchar等。
  • 如果在动态查询中嵌入对象名称,则始终使用quotename()。如果对象名称包含非字母数字字符或其他方式为奇数,则可以防止发生有趣的事情。