自动生成与现有表匹配的用户定义表类型

Vac*_*ano 8 sql t-sql sql-server-2008 sql-server-2008-r2

我的数据库中已存在多个表.其中一些有很多专栏.

我想制作一些存储过程来与这些表进行合并语句.为此,我希望存储过程的参数是用户定义的表类型.

我可以在每个表中编写脚本并将其修改为用户定义的表类型创建语句.

但我真正想要的是一种从我的数据库中的现有表生成用户定义的表类型的方法. 然后我可以将该脚本添加到我的数据库构建中(然后向表中添加新列不需要多个编辑).

有没有办法做到这一点?或者我应该忙着编写表格的脚本?

tak*_*krl 5

我不时需要同样的东西。这是我放在一起的一个小脚本。这有点粗糙,我不会相信我的生活,但它对我的情况相当有效。它没有脚本键,但对于我的场景来说这是没有必要的。不过,我使用的是 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;
Run Code Online (Sandbox Code Playgroud)


Mat*_*lie 3

在 SQL Server Management Studio 中,您可以右键单击数据库,然后在“任务”下选择为数据库编写脚本。仅选择表格,然后选择您感兴趣的表格。

它不会为您提供所需的一站式服务,但它可以快速轻松地编写许多表的脚本。然后允许您进行一些查找和替换以获得您需要的内容。