Čas od času potřebuji to samé. Zde je malý scénář, který jsem dal dohromady. Je to trochu drsné a život bych tomu nesvěřil, ale na můj případ to funguje celkem dobře. Nedělá skriptovací klíče, ale pro můj scénář to není nutné. Jsem však na SQL 2012, takže si nejsem úplně jistý, že to bude fungovat jako na SQL 2008. Netestoval jsem to pro některé „exotičtější“ typy, jako je geometry
, geography
a přátelé, protože jsem je nikdy nepotřeboval použít.
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;