sql >> Databasteknik >  >> RDS >> Sqlserver

Generera automatiskt en användardefinierad tabelltyp som matchar en befintlig tabell

Jag behöver samma sak då och då. Här är ett litet manus jag satt ihop. Det är lite grovt och jag skulle inte lita på det med mitt liv, men det fungerar ganska bra för mitt fall. Det skriptar inte nycklar, men för mitt scenario är det inte nödvändigt. Jag använder SQL 2012 dock, så jag är inte helt säker på att detta kommer att fungera som det är på SQL 2008. Jag testade det inte för några av de mer "exotiska" typerna som geometry , geography och vänner, eftersom jag aldrig behövde använda dem.

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;


  1. Välj poster från NOW() -1 Dag

  2. Oracle Database12c ORA 01918 och anslutningsfel

  3. Uppdatera fråga baserat på skick

  4. Databasanvändarhantering:Hantera roller för MariaDB