2017-08-21 33 views
0

T-SQLを使用してSQL Serverデータベースを複製するプロシージャを作成したいとします。私はオブジェクト(テーブル、プロシージャ、関数、...)を複製するためにカーソルを使用しています。ユーザー定義のテーブル型定義

システムカタログビューからユーザー定義テーブルタイプ定義を取得するにはどうすればよいですか?

答えて

0

オブジェクトエクスプローラでコピーするテーブルを探します。テーブル名を右クリックし、[スクリプトテーブル]> [CREATE To]> [New Query Editor]ウィンドウを選択します。

+0

後でソースデータベースにユーザー定義のテーブル型を追加できるので、カーソルを使用してすべての型をループするユーザー定義のテーブル型をコピーする必要があります。 –

5

ここにあなたの答えがあります。以下のクエリは、すべての型の結果をテキストとして返します。ループなどを使用してこの結果を進め、別のデータベースに移行することができます。

SELECT ' 
IF EXISTS (SELECT * FROM sys.types st JOIN sys.schemas ss ON st.schema_id = ss.schema_id WHERE st.name = N''' + st.[name] + ''' AND ss.name = N''' + ss.[name] + ''') 
    DROP TYPE ' + QUOTENAME(ss.name, '[') + '.' + QUOTENAME(st.name, '[') + ' 
GO 

CREATE TYPE ' + QUOTENAME(ss.name, '[') + '.' + QUOTENAME(st.name, '[') + ' FROM ' + 
QUOTENAME(bs.[name], '[') + 
    CASE bs.[name] 
     WHEN 'char' THEN (CASE ISNULL(st.max_length, 0) WHEN 0 THEN '' WHEN -1 THEN '(MAX)' ELSE '(' + convert(varchar(10), st.max_length) + ')' END) 
     WHEN 'nchar' THEN (CASE ISNULL(st.max_length, 0) WHEN 0 THEN '' WHEN -1 THEN '(MAX)' ELSE '(' + convert(varchar(10), st.max_length/2) + ')' END) 
     WHEN 'varchar' THEN (CASE ISNULL(st.max_length, 0) WHEN 0 THEN '' WHEN -1 THEN '(MAX)' ELSE '(' + convert(varchar(10), st.max_length) + ')' END) 
     WHEN 'nvarchar' THEN (CASE ISNULL(st.max_length, 0) WHEN 0 THEN '' WHEN -1 THEN '(MAX)' ELSE '(' + convert(varchar(10), st.max_length/2) + ')' END) 
     WHEN 'numeric' THEN (CASE ISNULL(st.[precision], 0) WHEN 0 THEN '' ELSE '(' + convert(varchar(10), st.[precision]) + ', ' + convert(varchar(10), st.[scale]) + ')' END) 
     WHEN 'decimal' THEN (CASE ISNULL(st.[precision], 0) WHEN 0 THEN '' ELSE '(' + convert(varchar(10), st.[precision]) + ', ' + convert(varchar(10), st.[scale]) + ')' END) 
     WHEN 'varbinary' THEN (CASE st.max_length WHEN -1 THEN '(max)' ELSE '(' + convert(varchar(10), st.max_length) + ')' END) 
     ELSE '' 
    END + 
' 
GO 
' 
FROM sys.types st 
    INNER JOIN sys.schemas ss ON st.[schema_id] = ss.[schema_id] 
    INNER JOIN sys.types bs ON bs.[user_type_id] = st.[user_type_id] 
WHERE st.[is_user_defined] = 1 
ORDER BY st.[name], ss.[name] 
+0

それはかなり涼しいです –

+0

ありがとう、あなたの答えは私をたくさん助けました。 –

関連する問題