我在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。
答案 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'