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。我刚刚尝试了此操作,但没有收到错误,也没有添加任何列