2

データベースの列/列情報に基づいて、列宣言に必要な sql データ型を含む文字列を取得する簡単な方法はありますか。

たとえば、次のような文字列が返されるようにします。

varchar(200)
datetime
numeric(35,5)

明らかに、これを自分で生成するために必要な情報を取得して処理を開始できますがSYS.COLUMNSINFORMATION_SCHEMA.COLUMNSデータ型/最大長/精度/スケール情報を自動的に列宣言データ型に変換する (できれば MS が提供する) 方法が必要でした。

これを行う標準的な方法があれば、考えられるすべてのデータ型を処理できると思いますが、これを手動でカバーするのは面倒です。

編集: 申し訳ありませんが、私が何を望んでいるかについて十分に明確ではないようです。

たとえば、CREATESSMS でテーブルのスクリプトを作成すると、結果のスクリプトには必要な形式のデータ型が含まれます。これらを自動的に取得する方法はありますか?

編集:

OK: もう 1 つ:

私が欲しいのは、この質問のようなものです:

列の型に基づく変数型の宣言

違いは、動的 SQL を既に使用しているため、変数を動的に宣言する必要がないことです。

4

5 に答える 5

3

残念ながら、適切な方法はわかりませんが、その方法を試してみましたINFORMATION_SCHEMA.Columns。これはきれいではありませんが、データベースのデフォルト、nullables などを処理します。

SELECT column_name + ' ' + DATA_TYPE + COALESCE('(' + CASE
                                                        WHEN DATA_TYPE = 'XML' THEN NULL
                                                        WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN 'max'
                                                        ELSE Cast(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(5))
                                                      END + ')', '(' + Cast(NUMERIC_PRECISION AS NVARCHAR(5)) + ',' + Cast(NUMERIC_SCALE AS NVARCHAR(5)) + ')', '') + ' ' + CASE IS_NULLABLE
                                                                                                                                                                              WHEN 'YES' THEN 'NULL'
                                                                                                                                                                              ELSE 'NOT NULL'
                                                                                                                                                                            END + COALESCE(' DEFAULT' + COLUMN_DEFAULT, '')
FROM   INFORMATION_SCHEMA.Columns
WHERE  table_name = 'mytable'
于 2012-06-18T14:06:58.993 に答える
0

からの 2 番目の結果セットはsp_helpどうですか? その出力を簡単に微調整して、必要なものを正確に取得できると思います。

于 2012-06-18T12:15:21.770 に答える
0
SELECT
OBJECT_NAME(c.OBJECT_ID) TableName
,c.name AS ColumnName
,t.name AS TypeName
,c.max_length
,c.PRECISION
,c.scale
FROM sys.columns AS c
JOIN sys.types AS t ON c.user_type_id=t.user_type_id
ORDER BY c.OBJECT_ID

(information_schema.columns)または上記のクエリのいずれかの方法で、正しいデータ型宣言を生成するために戻りセットを「マッサージ」する必要があるのではないかと心配しています。

于 2012-06-18T12:07:29.297 に答える