Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否可以在SQL Server中将视图脚本化为表?_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 是否可以在SQL Server中将视图脚本化为表?

Sql server 是否可以在SQL Server中将视图脚本化为表?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,在“脚本到”选项下,您可以选择脚本为“创建到您想要的任何内容”。是否有任何方法可以使用类似的方法为视图获取匹配的表结构?不是现成的。您可以从视图中执行选择进入,创建一个新的空表,然后使用通常的SSMS方法将其作为创建表编写脚本 SELECT TOP 0 * INTO NewTable FROM YourView 如果这是问题的动机,这可能会节省一点输入。如果您的意思是根据视图定义中选择的列生成一个CREATE TABLE语句,我不知道没有中间步骤(如@Martin所建议的)就可以做到这一点。下

在“脚本到”选项下,您可以选择脚本为“创建到您想要的任何内容”。是否有任何方法可以使用类似的方法为视图获取匹配的表结构?

不是现成的。您可以从视图中执行
选择进入
,创建一个新的空表,然后使用通常的SSMS方法将其作为
创建表
编写脚本

SELECT TOP 0 * INTO NewTable FROM YourView

如果这是问题的动机,这可能会节省一点输入。

如果您的意思是根据视图定义中选择的列生成一个
CREATE TABLE
语句,我不知道没有中间步骤(如@Martin所建议的)就可以做到这一点。

下面是我们用来实现这一点的方法

下面的所有内容都归功于top post和@Zanlok,我使用了他们的修订版来查看视图,而不是表格:



    SELECT 
        t.TABLE_CATALOG,
        t.TABLE_SCHEMA,
        t.TABLE_NAME,
        'create table '+QuoteName(t.TABLE_SCHEMA)+'.' + QuoteName(so.name) + ' (' + LEFT(o.List, Len(o.List)-1) + ');  ' 
            + CASE WHEN tc.Constraint_Name IS NULL THEN '' 
              ELSE 
                'ALTER TABLE ' + QuoteName(t.TABLE_SCHEMA)+'.' + QuoteName(so.name) 
                + ' ADD CONSTRAINT ' + tc.Constraint_Name  + ' PRIMARY KEY ' + ' (' + LEFT(j.List, Len(j.List)-1) + ');  ' 
              END as 'SQL_CREATE_TABLE'
    FROM sysobjects so

    CROSS APPLY (
        SELECT 
              '  ['+column_name+'] ' 
              +  data_type 
              + case data_type
                    when 'sql_variant' then ''
                    when 'text' then ''
                    when 'ntext' then ''
                    when 'decimal' then '(' + cast(numeric_precision as varchar) + ', ' + cast(numeric_scale as varchar) + ')'
                  else 
                  coalesce(
                    '('+ case when character_maximum_length = -1 
                        then 'MAX' 
                        else cast(character_maximum_length as varchar) end 
                    + ')','') 
                end 
            + ' ' 
            + case when exists ( 
                SELECT id 
                FROM syscolumns
                WHERE 
                    object_name(id) = so.name
                    and name = column_name
                    and columnproperty(id,name,'IsIdentity') = 1 
              ) then
                'IDENTITY(' + 
                cast(ident_seed(so.name) as varchar) + ',' + 
                cast(ident_incr(so.name) as varchar) + ')'
              else ''
              end 
            + ' ' 
            + (case when IS_NULLABLE = 'No' then 'NOT ' else '' end) 
            + 'NULL ' 
            + case when information_schema.columns.COLUMN_DEFAULT IS NOT NULL THEN 'DEFAULT '+ information_schema.columns.COLUMN_DEFAULT 
              ELSE '' 
              END 
            + ','  -- can't have a field name or we'll end up with XML

        FROM information_schema.columns 
        WHERE table_name = so.name
        ORDER BY ordinal_position
        FOR XML PATH('')
    ) o (list)

    LEFT JOIN information_schema.table_constraints tc on  
        tc.Table_name = so.Name
        AND tc.Constraint_Type  = 'PRIMARY KEY'

    LEFT JOIN information_schema.tables t on  
        t.Table_name = so.Name

    CROSS APPLY (
        SELECT QuoteName(Column_Name) + ', '
        FROM information_schema.key_column_usage kcu
        WHERE kcu.Constraint_Name = tc.Constraint_Name
        ORDER BY ORDINAL_POSITION
        FOR XML PATH('')
    ) j (list)

    WHERE
        xtype = 'V'
        AND name NOT IN ('dtproperties')
        -- AND so.name = 'ASPStateTempSessions'
    ;


如果您有权访问SSI,请插入数据流。对于源代码,请使用您的视图。对于目的地,使用新表。整个表将使用列和数据类型生成。如果不想传输数据,可以保持原样。单击“是”保存数据流时,表可能已经创建。现在,如果希望查看刚生成的新表的列名和数据类型,可以转到SSMS并生成脚本。

如果已安装,可以使用SQL Server导入和导出向导。将源和目标设置为同一服务器,源为视图,目标为新表。这将从视图中获取列定义,并使用这些定义创建一个新表

明显的缺点是,新表将包含来自旧视图的数据,如果视图中有大量行,这可能是一个问题。解决此问题以及创建具有视图定义的空白表的最简单方法是在wizare中选择选项“编写查询以指定要传输的数据”,并使用如下代码:

SELECT * FROM YourView WHERE 1=2
由于1不等于2,因此不会返回任何行,但会保留列定义,并使用该定义创建新表


希望有帮助

您的意思是根据视图定义中选择的列生成
createtable
语句吗?据我所知……这个问题提醒了我,这可能对你有帮助,也可能对你没有帮助。@djacobson,我开始认为你是对的。把它作为答案贴出来,我会接受的。这是我想要复制的表结构,而不是数据。这就是为什么没有插入数据的原因!一旦新表存在,您可以使用标准SSMS功能编写脚本。我很困惑,您是说我需要手动创建表吗?@Abe Miessler我相信他的意思是,一旦SQL查询创建表,您就可以选择表并“脚本为->创建表为”在SSMS中获得所需的
CREATE TABLE
语句。很好,我问了与Abe相同的问题,但后来我尝试了一下,效果非常好。