我的数据库中已存在多个表。其中一些有很多专栏。
我想制作一些存储过程来与这些表进行合并语句。为此,我希望存储过程的参数是用户定义的表类型。
我可以在每个表中编写脚本并将其修改为用户定义的表类型创建语句。
但我真正想要的是一种从我的数据库中的现有表生成用户定义的表类型的方法。然后我可以将该脚本添加到我的数据库构建中(然后添加新列到一个表不需要多个编辑)。
有办法吗?或者我应该忙着编写表格的脚本?
答案 0 :(得分:3)
在SQL Server Management Studio中,您可以右键单击数据库,然后在TASKS下选择脚本化数据库。选择仅表格,然后选择您感兴趣的表格。
它不会为您提供一站式服务,但它可以快速轻松地编写许多表格。然后让你做一些查找和替换来获得你需要的东西。
答案 1 :(得分:1)
我从来不知道有一个用于生成数据库脚本的向导,就像Dems在他们的回答中所说的那样。它似乎比我一直使用的方法更通用,因为该向导允许您一次为不同类型的对象生成脚本。
尽管如此,我想我会分享我的,因为在我看来它更简单一些,当你只需要编写相同类型的对象时,它就会非常方便,就像只有表格一样。
所以,这里(特别是表格):
打开对象资源管理器( F8 )并将其连接到目标服务器实例。
展开数据库项目。
使用您的数据库名称展开项目。
点击表格。
打开对象资源管理器详细信息( F7 )。它现在应该显示用户表列表。
使用标准Windows方法选择多个对象(例如 Ctrl +单击),选择要编写脚本的表。
右键单击任何所选项目,然后选择脚本表格为▸,然后选择脚本类型以及保存位置。
当您需要编写不同类型的对象时,请转到另一个对象资源管理器“文件夹”而不是 Tables ,例如对于存储过程,它将是可编程性\存储过程。
答案 2 :(得分:1)
我不时需要同样的东西。这是我放在一起的一个小脚本。这有点粗糙,我不相信我的生活,但它对我的情况来说效果相当好。它没有脚本键,但对于我的场景,这不是必需的。我正在使用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;