Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Générer automatiquement un type de tableau défini par l'utilisateur qui correspond à un tableau existant

J'ai besoin de la même chose de temps en temps. Voici un petit script que j'ai mis en place. C'est un peu rude et je ne lui confierais pas ma vie, mais cela fonctionne raisonnablement bien pour mon cas. Il ne contient pas de clés de script, mais pour mon scénario, ce n'est pas nécessaire. Je suis sur SQL 2012 cependant, donc je ne suis pas complètement sûr que cela fonctionnera tel quel sur SQL 2008. Je ne l'ai pas testé pour certains des types les plus "exotiques" comme geometry , geography et mes amis, car je n'ai jamais eu besoin de les utiliser.

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;