0

smallintデータベースのすべての型列を型に変換するにはどうすればよいbitですか? SQL Server 2008 を使用しています。

4

3 に答える 3

0

SQL Server では、ALTER TABLE my_table ALTER COLUMN my_column [new_datatype].

私はそれらでテストしていないので、デフォルト値などに注意してください。

例 1 - 確認/修正/実行するクエリのリストが表示されます (より安全なオプション)。

DECLARE @TableSchema VARCHAR(100)
DECLARE @TableName VARCHAR(100)
DECLARE @ColumnName VARCHAR(100)
DECLARE @Query NVARCHAR(1000)

DECLARE @FromDataType NVARCHAR(50)
DECLARE @ToDataType NVARCHAR(50)

SET @TableSchema = 'dbo';
SET @FromDataType = 'smallint';
SET @ToDataType = 'bit';

DECLARE c CURSOR FAST_FORWARD FOR 
    SELECT TABLE_NAME, COLUMN_NAME 
    FROM   INFORMATION_SCHEMA.COLUMNS 
    WHERE  TABLE_SCHEMA = @TableSchema 
       AND TABLE_NAME <> 'sysdiagrams' 
       AND DATA_TYPE = @FromDataType

OPEN c;

FETCH NEXT FROM c INTO @TableName, @ColumnName;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Query = N'ALTER TABLE ' + @TableName + N' ALTER COLUMN ' + @ColumnName + N' ' + @ToDataType -- + CHAR(13) + N'GO'
    PRINT @Query

    EXEC sp_EXECUTESQL @Query

    FETCH NEXT FROM c INTO @TableName, @ColumnName;
END

CLOSE c;
DEALLOCATE c;

例 2 - 実行します (最初に例 1 を実行することをお勧めします!)

DECLARE @TableSchema VARCHAR(100)
DECLARE @TableName VARCHAR(100)
DECLARE @ColumnName VARCHAR(100)
DECLARE @Query NVARCHAR(1000)

DECLARE @FromDataType NVARCHAR(50)
DECLARE @ToDataType NVARCHAR(50)

SET @TableSchema = 'dbo';
SET @FromDataType = 'smallint';
SET @ToDataType = 'bit';

DECLARE c CURSOR FAST_FORWARD FOR 
    SELECT TABLE_NAME, COLUMN_NAME 
    FROM   INFORMATION_SCHEMA.COLUMNS 
    WHERE  TABLE_SCHEMA = @TableSchema 
       AND TABLE_NAME <> 'sysdiagrams' 
       AND DATA_TYPE = @FromDataType

OPEN c;

FETCH NEXT FROM c INTO @TableName, @ColumnName;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Query = N'ALTER TABLE ' + @TableName + N' ALTER COLUMN ' + @ColumnName + N' ' + @ToDataType + CHAR(13) + N' GO'
    PRINT @Query

    FETCH NEXT FROM c INTO @TableName, @ColumnName;
END

CLOSE c;
DEALLOCATE c;
于 2012-08-15T19:04:22.307 に答える
0

これは慎重に行い、最初にバックアップ データベースでテストしてください。次のクエリは、データ型が SMALLINT のデータベース内の各列に対して ALTER ステートメントを作成し、それらを BIT に変換します。

select 'ALTER TABLE ' + QUOTENAME(o.Name) + ' ALTER COLUMN ' + QUOTENAME(c.Name) + ' BIT' as Command
from sys.objects o
inner join sys.columns c
on o.object_id = c.object_id
where system_type_id = 52
and o.Type = 'U'

また、リストされている各列に 1 または 0 のみが含まれていることを確認してください。そうしないと、スクリプトを実行したときに切り捨てエラーが発生します。

于 2012-08-15T18:37:13.237 に答える
-1

列のデータ型の変換について質問している場合、それを直接行うことはできません。新しい列をBITとして追加し、古い列からデータを入力してから、古い列を削除して、新しい列の名前を古い名前に戻すことができます。

詳細については、オンラインドキュメントを参照してください。

于 2012-08-15T18:17:51.843 に答える