Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Generieren Sie automatisch einen benutzerdefinierten Tabellentyp, der einer vorhandenen Tabelle entspricht

Ab und zu brauche ich das gleiche. Hier ist ein kleines Skript, das ich zusammengestellt habe. Es ist ein bisschen rau und ich würde ihm nicht mein Leben anvertrauen, aber es funktioniert ziemlich gut für meinen Fall. Es werden keine Schlüssel geschrieben, aber für mein Szenario ist das nicht erforderlich. Ich bin jedoch auf SQL 2012, daher bin ich mir nicht ganz sicher, ob dies so funktioniert wie auf SQL 2008. Ich habe es nicht für einige der "exotischeren" Typen wie geometry getestet , geography und Freunde, da ich sie nie verwenden musste.

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;