在不使用SELECT TOP(0)* INTO的情况下克隆表

时间:2014-07-18 15:54:06

标签: sql sql-server sql-scripts

我需要创建数据库表的副本。 我需要设置TEXTIMAGE_ON值,该值只能在创建时创建,而不能在之后使用ALTER TABLE创建。

我也不允许事先更改任何数据库属性。所以基本上不是:

ALTER DATABASE backoffice MODIFY FILEGROUP filegroup DEFAULT

这就是为什么我不能只使用:

SELECT TOP (0) * INTO [DestinationSchema].[DestinationTable] FROM [SourceSchema].[SourceTable]

克隆我的桌子。

我基本上寻找一个脚本或创建表的任何其他方式,而不是逐步克隆列。

我很感激任何帮助。

4 个答案:

答案 0 :(得分:1)

这至少可以让你开始。你还有一些工作要做,但这应该为你提供了为此构建一些动态sql所需的信息。

declare @TableName sysname = 'YourTable'

select *
from sys.columns c
join sys.types t on c.user_type_id = t.user_type_id
where c.object_id = object_id(@TableName)

你需要很多案例表达来适应一切。

答案 1 :(得分:0)

这样的事情会起作用吗?

  Select * 
     INTO NewTable
     FROM table
     WHERE 1=2

答案 2 :(得分:0)

这应该让你在那里。您可能仍需要根据要求对其进行优化。希望这有帮助

DECLARE @TableName SYSNAME = 'TableName';

DECLARE @SQL VARCHAR(MAX),
@ColumnList VARCHAR(MAX),
@Schema VARCHAR(250);

SELECT @Schema = QUOTENAME(TABLE_SCHEMA)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @TableName;

SET @SQL = 'CREATE TABLE ' + @Schema + '.' + QUOTENAME(@TableName) + '(' + CHAR(13) + CHAR(10);

WITH cte_columns
    AS (
    SELECT
           CHAR(9) + QUOTENAME(COLUMN_NAME) + ' ' + CASE
                                                    WHEN DOMAIN_SCHEMA IS NULL THEN ''
                                                    ELSE QUOTENAME(DOMAIN_SCHEMA)
                                                    END + '.' + CASE
                                                                WHEN DOMAIN_SCHEMA IS NULL THEN DATA_TYPE + QUOTENAME(CHARACTER_MAXIMUM_LENGTH, '(')
                                                                ELSE QUOTENAME(DOMAIN_NAME)
                                                                END + CASE
                                                                      WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL'
                                                                      ELSE ' NULL'
                                                                      END AS ColumnList
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @TableName
    )
    SELECT
           @ColumnList = COALESCE(@ColumnList + ',' + CHAR(13) + CHAR(10), '') + ColumnList
    FROM cte_columns;

SET @SQL = @SQL + @ColumnList + ')';

PRINT @SQL;

答案 3 :(得分:0)

使用INFORMATION_SCHEMA.COLUMNS视图,您可以提取表格定义

这样的东西
SELECT column_name,data_type,is_nullable,--logic for length calculation
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tablename'

这应该让你开始,你可以使用光标覆盖这样的查询来构建你的模式定义