Saya membutuhkan hal yang sama dari waktu ke waktu. Berikut skrip kecil yang saya buat. Ini agak kasar dan saya tidak akan mempercayainya dengan hidup saya, tetapi itu bekerja dengan cukup baik untuk kasus saya. Itu bukan kunci skrip, tetapi untuk skenario saya itu tidak perlu. Saya menggunakan SQL 2012, jadi saya tidak sepenuhnya yakin ini akan berfungsi seperti pada SQL 2008. Saya tidak mengujinya untuk beberapa tipe yang lebih 'eksotis' seperti geometry
, geography
dan teman-teman, karena saya tidak pernah perlu menggunakannya.
declare
@tablename nvarchar(50)='Users',
@schemaname nvarchar(50)='dbo',
@sql nvarchar(max)=N'';
select @sql += N',' + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'[' + c.COLUMN_NAME + N'] [' + DATA_TYPE + N']'
+ case when c.CHARACTER_MAXIMUM_LENGTH is not null then N'(' + case c.CHARACTER_MAXIMUM_LENGTH when -1 then 'max' else cast(c.CHARACTER_MAXIMUM_LENGTH as nvarchar(10)) end + N')' else N'' end
+ case when c.DATA_TYPE = N'numeric' then N'('+CAST(NUMERIC_PRECISION as nvarchar(10))+N', '+CAST(NUMERIC_SCALE as nvarchar(10))+N')' else N'' end
+ case when c.is_nullable <> N'NO' then N' NULL' else N' NOT NULL'end
from INFORMATION_SCHEMA.COLUMNS c
where TABLE_NAME = @tablename AND TABLE_SCHEMA = @schemaname
order by ORDINAL_POSITION;
set @sql = stuff(@sql, 1, 1, N'CREATE TYPE [' + @schemaname + N'].[tab_' + @tablename + N'] AS TABLE(')
+ nchar(13) + nchar(10) + ')' + nchar(13) + nchar(10) + 'GO';
set @sql += nchar(13) + nchar(10) + '--GRANT EXEC ON TYPE::[' + @schemaname + N'].[tab_' + @tablename + N'] TO [User];'
+ nchar(13) + nchar(10) + '--GO';
print @sql
-- If you're happy with the sql, you can pass it to sp_executesql to create your type
-- exec sp_executesql @sql;