Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Автоматично генериране на дефиниран от потребителя тип таблица, която съответства на съществуваща таблица

Имам нужда от същото от време на време. Ето един малък скрипт, който съставих. Това е малко грубо и не бих му поверил живота си, но работи сравнително добре за моя случай. Не скриптира ключове, но за моя сценарий това не е необходимо. Все пак съм на SQL 2012, така че не съм напълно сигурен, че това ще работи както е на SQL 2008. Не го тествах за някои от по-„екзотичните“ типове като geometry , geography и приятели, тъй като никога не ми е трябвало да ги използвам.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разделяне на разделени стойности в SQL колона на множество реда

  2. Възможно ли е да изчистите регистрационни файлове в SQL Server 2008 с помощта на заявка?

  3. Пропускане на милисекунди в дата

  4. Защо един оператор за изтриване на SQL ще доведе до блокиране?

  5. MIN и MAX агрегатни функции в SQL Server