0

我需要为一个表创建大约 300 列,我不想手动创建它。

我怎样才能做到这一点?我想要像这样的列

Bigint1..to..Bigint60
Text1  ..to..Text60

等等。

IF (NOT EXISTS (SELECT * 
 FROM INFORMATION_SCHEMA.TABLES 
 WHERE TABLE_SCHEMA = 'dbo' 
 AND  TABLE_NAME = 'mytbl'))
begin
    create table OBJ_AttributeValues(
    ObjectID numeric(18,0) not null
    );
end
else
begin
    DECLARE @A INT
    set @A = 1;
    WHILE(@A <=60)
    BEGIN
        alter table OBJ_AttributeValues
        add ...............................
        set @A = @A+1;
    END
end

我应该写什么而不是“...”?

4

2 回答 2

1

您将需要为此使用动态 SQL,例如

DECLARE @SSQL VARCHAR(1000)
DECLARE @A INT
set @A = 1;
WHILE(@A <=60)
BEGIN
    SET @SSQL = 'alter table OBJ_AttributeValues add Bigint' + CAST(@A as varchar) + ' bigint'
    EXEC (@SSQL)
    set @A = @A+1;
END
于 2013-08-30T14:34:10.727 回答
1

这不是一个好主意,您应该花时间编写 sql 或者只是从 Excel 或类似的东西中复制粘贴列。您也不应该使用TEXT数据类型,已弃用并充满限制(VARCHAR(MAX)如果需要,请使用)。也就是说,这是一种使用动态 SQL 的方法:

DECLARE @BigintCols NVARCHAR(MAX), @TextCols NVARCHAR(MAX)
DECLARE @Query NVARCHAR(MAX)
SET @BigintCols = ''
SET @TextCols = ''

SELECT  @BigintCols = @BigintCols + N'Bigint' + CAST(number AS NVARCHAR(2)) + N' BIGINT,',
        @TextCols = @TextCols + N'Text' + CAST(number AS NVARCHAR(2)) + N' TEXT,'
FROM master..spt_values
WHERE type = 'P'
AND number BETWEEN 1 AND 60
ORDER BY number

SET @Query = '
CREATE TABLE OBJ_AttributeValues(ObjectID numeric(18,0) not null,'+@BigintCols+
LEFT(@TextCols,LEN(@TextCols)-1)+')'

EXECUTE sp_executesql @Query

哦,您可能应该先阅读有关动态 sql的内容。

于 2013-08-30T14:40:45.280 回答