内部的动态查询如果存在则无效

时间:2016-01-20 13:07:26

标签: sql sql-server variables

我在If exists中编写动态SQL。我对sys.columns进行了查询,以检查部门ID列是否存在。如果它存在,我必须检查行计数并进入if语句。我无法在查询中出错。有人请指出。

DECLARE @TableName VARCHAR(100) = '[Student]'
DECLARE @ColName VARCHAR(10) = 'DeptId'
DECLARE @Query NVARCHAR(1000) = '
    SELECT *
    FROM sys.columns
    WHERE Name =' + @ColName + 'AND Object_ID = Object_ID(' + @TableName + ')'

DECLARE @rowcnt INT

EXEC sp_executesql @query

SELECT @rowcnt = @@ROWCOUNT

IF (@rowcnt > 0)
    BEGIN
        PRINT 'row present'
    END 
  

错误 - 'Object_ID'附近的语法不正确。

它总是将行数返回为1。

3 个答案:

答案 0 :(得分:3)

我要说明什么是错的,但是我会让你修复查询,因为有很多选项。查询返回错误。我不确定为什么@@ROWCOUNT返回为1,但您缺少Name的单引号。因此,您很可能会收到DEPTID不是有效列的错误。

你可以通过输入单引号来天真地解决这个问题。但是,您应该使用sp_execute_sql的参数来传递参数。

并且,我将补充说这可能是不必要的,因为通常会做:

if (exists (select 1
            from information_schema.columns
            where table_name = @table_name and column_name = @column_name
           )
   )
begin
 . . .
end;

当然,这不是从名称中解析对象,但很少需要,特别是如果你没有在表名和列名中加入奇怪的字符。

答案 1 :(得分:0)

幸运的是,在这种情况下不需要动态SQL。您可以使用参数化查询。

SELECT @rowcnt = COUNT(*)
FROM sys.columns
WHERE [name] = @ColName
AND [object_id] = OBJECT_ID(@TableName)

答案 2 :(得分:0)

DECLARE @TableName SYSNAME = 'dbo.test',
        @ColName SYSNAME = 'col1'

IF COL_LENGTH(@TableName, @ColName) IS NOT NULL
    PRINT 'column present'