T-SQL检查存储过程中是否存在带IF的列
如果不存在T-SQL检查存储过程中是否存在带IF的列,sql,tsql,stored-procedures,sql-server-2008-r2,Sql,Tsql,Stored Procedures,Sql Server 2008 R2,如果不存在语句,则我对语句有问题。我在使用存储过程中使用了以下代码: IF NOT EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tableName' AND COLUMN_NAME = @fieldName AND TABLE_SCHEMA = 'dbo')
语句,则我对语句有问题。我在使用存储过程中使用了以下代码:
IF NOT EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tableName'
AND COLUMN_NAME = @fieldName
AND TABLE_SCHEMA = 'dbo')
BEGIN
DECLARE @paramDefinitions NVARCHAR(1000)
SET @paramDefinitions=
'@dataType nvarchar(100) OUTPUT'
SET @typeQuery = 'SELECT @dataType =
CASE
WHEN s.name = ''nvarchar'' THEN ''nvarchar('' + CAST(c.max_length AS varchar(4)) + '')''
WHEN s.name = ''varchar'' THEN ''varchar('' + CAST(c.max_length AS varchar(4)) + '')''
WHEN s.name = ''char'' THEN ''char('' + CAST(c.max_length AS varchar(4)) + '')''
WHEN s.name = ''nchar'' THEN ''nchar('' + CAST(c.max_length AS varchar(4)) + '')''
ELSE s.name
END
FROM sys.views t JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types s ON c.user_type_id = s.user_type_id
WHERE t.name = ''tablename'' AND c.name =' + @tmpField
EXEC sp_executesql @typeQuery, @paramDefinitions, @dataType OUTPUT
SET @updateTable = 'Alter table dbo.tablename add ' + @field +' '+ @dataType
print @updateTable
EXEC sp_executesql @updateTable
END
如果现在启动SP,它会尝试重新创建现有列,但也会创建任何新列。如果我将其更改为如果存在
它将不会做任何事情
如果我单独运行select语句,如果该列存在,则结果为1,如果不存在,则结果为零。我的错在哪里?如果不存在,是否可以使用进行此操作?如果要检查表是否包含某些列,请使用COLUMNPROPERTY:
IF COLUMNPROPERTY(object_id('[dbo].[TABLE]'), 'COLUMN_NAME', 'AllowsNull') is NULL
BEGIN
SELECT 'The column does not exists'
END
你能发布所有相关代码吗?例如,“创建字段”片段,或者可能是整个存储过程(如果可能)。显示BEGIN
和END
之间的代码。使用请求的信息更新初始帖子是否在exists块中设置了所有变量?试着打印里面的所有变量,在我的例子中,代码总是有效的(也就是说,exists块正在被执行)。但我看到的是,我的数据类型变量为空/NULL,因此我没有正确地获取语句。我确实在exists块之外设置/声明了一些变量,因为我需要这样做,以使正确的值处于就绪状态。如果我使用columnproperty,它不会创建任何内容。如果尝试打印结果,也不会得到任何结果:print COLUMNPROPERTY(object_id('[dbo].[t_hist_deviceport]'),@tmpField,'AllowsNull')。我认为我的问题是字段名中的空格…您是否能够在不使用@tmpField变量的情况下检查COLUMNPROPERTY?否,因为此检查发生在游标内部,并且该变量是从游标获取下一个变量的结果。如果@tmpField是varchar,您可以放入raiserror(@tmpField,11,1)以查看值。刚刚检查了我的环境中的代码:即使用空格传递参数,它也可以正常工作。如果指定的表中不存在该列,则它应该返回NULL。我刚刚尝试了此操作,但没有收到错误,也没有添加任何列