2

目標:
列Firstnameに。があるかどうかを調べますvarchar(20)。trueの場合、テーブルなどを変更します。

問題:
列Firstnameの内部にvarchar 20があるかどうかを確認するのに問題があります(存在する場合)すべてがSQL Server2008R2で行われます

テーブルスタッフ
列:

Firstname varchar(20)  
Lastname varchar(100)
if Exists()   // Find out if column Firstname has varchar(20)
begin 

   // Alter table and its specific column

end 
4

4 に答える 4

8

情報スキーマビューはこれCOLUMNSに最適です。

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = [table] AND COLUMN_NAME = [column]
AND DATA_TYPE = 'varchar' AND CHARACTER_MAXIMUM_LENGTH = 20
于 2011-11-11T13:30:45.410 に答える
5
IF EXISTS
    (SELECT *
    FROM    sys.columns c
    WHERE   c.object_id = OBJECT_ID('MySchema.MyTable')
    AND c.name = 'MyColumn'
    AND c.system_type_id = 167 --167 = varchar SELECT * FROM sys.types WHERE name = 'varchar'
    AND c.max_length = 20)
BEGIN
    ALTER TABLE MySchema.MyTable
    ALTER COLUMN MyColumn VARCHAR(25) NULL; --or NOT NULL and/or DEFAULT ...
END
于 2011-11-11T13:28:41.077 に答える
4

sys.columns を使用している場合 - max_length 列は実際にはバイト単位の最大サイズであり、実際に宣言された列のサイズではないことに注意してください。

詳細については、こちらを参照してください: MSDN の sys.columns

これは char/varchar (サイズはnバイト) では正常に機能しますが、nchar と nvarchar ではバイト ストレージが異なります。nは文字列の長さです。

nchar は 2 nmax_length/2バイトなので、実際に宣言されたサイズ (1 ~ 4000) を取得する必要があります。

nvarchar も 2 n(max_length/2)バイトであるため、実際に宣言されたサイズを取得する必要があります。nvarchar も列ごとに追加の 2 バイトを使用しますが、これは sys.columns.max_length 列には含まれません。

また、覚えておいてください: nvarchar または nchar(max) 値は -1 を返します

コード例では、すべてのテーブルのすべての列を選択し、型の詳細を表示します:-

SELECT '[' + schema_name(t.[schema_id]) + '].[' + t.name + ']' AS TableName
            , '[' + c.name + ']' AS ColumnName
            , '[' + ty.name + ']' AS DataType
            , max_length_value = CASE WHEN c.max_length > -1
                AND (ty.name = 'nvarchar' 
                OR ty.name = 'nchar') THEN c.max_length/2 
            ELSE c.max_length END
            , max_length_bytes = c.max_length
            , c.is_nullable
        FROM sys.columns AS c
            INNER JOIN sys.tables AS t ON t.object_id = c.object_id
            INNER JOIN sys.types AS ty ON ty.system_type_id = c.system_type_id
                AND ty.user_type_id = c.user_type_id

MSDN の nchar と nvarchar :-

nchar [( n )] 固定長の Unicode 文字列データ。n は文字列の長さを定義し、1 ~ 4,000 の値にする必要があります。ストレージ サイズは、n バイトの 2 倍です。照合コード ページで 2 バイト文字が使用されている場合でも、ストレージ サイズは n バイトのままです。文字列によっては、n バイトのストレージ サイズが n に指定された値よりも小さくなる場合があります。nchar の ISO シノニムは、国別文字および国別文字です。

nvarchar [( n | max )] 可変長の Unicode 文字列データ。n は文字列の長さを定義し、1 ~ 4,000 の値を指定できます。max は、最大ストレージ サイズが 2^31-1 バイト (2 GB) であることを示します。ストレージ サイズ (バイト単位) は、入力されたデータの実際の長さの 2 倍 + 2 バイトです。nvarchar の ISO シノニムは、国別文字可変および国別文字可変です。

于 2012-06-26T05:51:44.807 に答える
1

このクエリに似たものを使用して、列が varchar(20) であるかどうかを確認できるはずです。これにより、情報スキーマのビューから選択され、列およびテーブル固有の条件でフィルター処理されます。

select t.name 'Table'
    , c.name 'Column'
    , c.max_length
from sys.columns c
inner join sys.tables t on
    t.object_id = c.object_id
inner join sys.types y on
    y.system_type_id = c.system_type_id
where c.name = 'FirstName'
    and t.name = 'MyTable'
    and y.name = 'varchar'
    and c.max_length = 20
于 2011-11-11T13:23:09.063 に答える