【问题标题】:Automatically generate a user defined table type that matches an existing table自动生成与现有表匹配的用户定义表类型
【发布时间】:2012-02-15 07:08:42
【问题描述】:

我的数据库中已经存在几个表。其中一些有很多列。

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

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

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

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

【问题讨论】:

  • 有系统存储过程,e.g. sp_columns,这将让您提取所有元数据。您可以对其进行按摩并使用动态 SQL 来创建克隆表。我假设您已经考虑过使用 SELECT * INTO NewTable FROM OldTable WHERE 42 = 13 创建一个新的空表,其结构与现有表相同,但没有行。
  • @user92546 - tableuser defined table type 不是一回事。

标签: sql sql-server-2008 tsql sql-server-2008-r2


【解决方案1】:

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

它不会为您提供所需的一站式服务,但它可以快速轻松地编写许多表格的脚本。然后让你做一些查找和替换来获得你需要的东西。

【讨论】:

    【解决方案2】:

    我从来不知道有一个生成数据库脚本的向导,就像 Dems 在他们的回答中所说的那样。而且它似乎是一种比我一直使用的方法更通用的方法,因为该向导允许您一次性为不同类型的对象生成脚本。

    不过,我想我还是会分享我的,因为在我看来它更简单一些,并且当您只需要编写相同类型的对象(如表)脚本时会派上用场。

    所以,这里(特别是表格):

    1. 打开对象资源管理器 (F8) 并将其连接到目标服务器实例。

    2. 展开Databases项。

    3. 使用您的数据库名称展开项目。

    4. 点击表格

    5. 打开对象资源管理器详细信息 (F7)。它现在应该显示用户表列表。

    6. 使用选择多个对象的标准 Windows 方法(如 Ctrl+单击),选择要编写脚本的表格。

    7. 右键单击任何选定的项目并选择 Script Table as ▸,然后选择脚本类型和保存位置。

    当您需要为不同类型的对象编写脚本时,请转到不同的对象资源管理器“文件夹”而不是 Tables,例如对于存储过程,它将是 Programmability\Stored Procedures

    【讨论】:

      【解决方案3】:

      我不时需要同样的东西。这是我放在一起的一个小脚本。这有点粗糙,我不会相信我的生活,但它对我的情况相当有效。它没有脚本键,但对于我的场景来说,这不是必需的。虽然我使用的是 SQL 2012,所以我不完全确定这是否会像在 SQL 2008 上一样工作。我没有针对geometrygeography 和朋友等一些更“异国情调”的类型对其进行测试,如我从来不需要使用它们。

      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;
      

      【讨论】:

        猜你喜欢
        • 2016-12-25
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多