我需要创建数据库表的副本。 我需要设置TEXTIMAGE_ON值,该值只能在创建时创建,而不能在之后使用ALTER TABLE创建。
我也不允许事先更改任何数据库属性。所以基本上不是:
ALTER DATABASE backoffice MODIFY FILEGROUP filegroup DEFAULT
这就是为什么我不能只使用:
SELECT TOP (0) * INTO [DestinationSchema].[DestinationTable] FROM [SourceSchema].[SourceTable]
克隆我的桌子。
我基本上寻找一个脚本或创建表的任何其他方式,而不是逐步克隆列。
我很感激任何帮助。
答案 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'
这应该让你开始,你可以使用光标覆盖这样的查询来构建你的模式定义