【问题标题】:How to get the "CREATE TABLE" query?如何获取“CREATE TABLE”查询?
【发布时间】:2012-08-10 00:44:58
【问题描述】:

当我右键单击我的视图并单击“脚本视图为”时,我收到以下错误:

属性 TextHeader 不适用于视图“[dbo].[TableName]”。这个 此对象的属性可能不存在,或者可能由于无法检索 访问权限不足。文本已加密。 (Microsoft.SqlServer.Smo)

我能够使用bcp 来获取表的转储,并创建一个给定here 的格式文件。该表有大约 60 列,我不想手动编写 CREATE TABLE 查询。有没有办法自动做到这一点?

我希望如此

BULK INSERT DB.dbo.TableName
FROM 'E:\Databases\TableName'
WITH (FORMATFILE = 'E:\Databases\TableName.Fmt');
GO

可以解决问题,但在我执行上述查询之前,表本身似乎应该存在于数据库中。有什么建议吗?

【问题讨论】:

  • 正如错误所暗示的,问题可能是权限。您可以访问 INFORMATION_SCHEMA 表吗?您可以从那里构造表(至少是列,这是 bcp 所需的全部内容)。
  • @GordonLinoff:如果这是System.Views 下的那个,是的,我可以访问它们。所以唯一的方法可能是获取这个模式的转储,然后手动创建查询?

标签: sql sql-server-2008 bcp


【解决方案1】:

您可以从 INFORMATION_SCHEMA.Columns 构造创建表语句。比如:

select (column_name + ' ' + data_type +
        (case when character_maximum_length is not null
              then '('+character_maximum_length+')'
              else ''
         end) + ','
       ) as ColumnDef
from Information_Schema.columns
order by ordinal_position

这可能已经足够了。例如,如果您必须处理数字,或者希望“is null”准确,则可以使其更复杂。

将结果复制到新窗口中,添加create table语句,删除最后的逗号并添加最后的结束括号。

您可以在更复杂的 SQL 语句中完成所有最后一步,但一次性完成更容易手动完成。

【讨论】:

  • 太棒了...!谢谢你的时间:)
猜你喜欢
  • 1970-01-01
  • 2013-04-13
  • 2019-07-23
  • 2012-11-22
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多