2

発言に問題ありIF NOT EXISTS。ストアド プロシージャを使用する内部で次のコードを使用しました。

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 を開始すると、既存の列を再作成しようとしますが、新しい列も作成されます。に変更しても何も起こりIF EXISTSません。

選択ステートメントを単独で実行すると、列が存在する場合は結果として 1 が返され、存在しない場合は何も返されません。私の間違いはどこですか?IF NOT EXISTSこの目的で使用することはできませんか?

4

1 に答える 1

1

テーブルに列が含まれているかどうかを確認したい場合は、COLUMNPROPERTYを使用します。

IF COLUMNPROPERTY(object_id('[dbo].[TABLE]'), 'COLUMN_NAME', 'AllowsNull') is NULL
BEGIN
SELECT 'The column does not exists'
END
于 2013-01-28T10:06:31.457 に答える