3

我想在一行中将 236 个 int 值存储到 sql 中。现在我必须声明表,但我不想输入列名的 236 倍。列名应该是 BYTE001、BYTE002、... 或其他前缀为 BYTE(B、INT、...)。是否可以自动生成 ColumnNames?

我尝试以下代码,但它不起作用:

USE dbXXX
DECLARE @Columname varchar(10)
SET @Columname = 'BYTE011'
ALTER table tbl_Archiv_BYTEsps
ADD @Columname int;

我想在while循环中生成列名,但似乎不允许将变量与ADD-Command一起使用。我总是收到错误:'@Columname' 附近的语法错误我该怎么做才能生成表?还是有另一种方法来存储我的 236 个整数值?

4

3 回答 3

3

试试这个——

IF OBJECT_ID ('dbo.temp') IS NOT NULL
   DROP TABLE dbo.temp

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = 'CREATE TABLE dbo.temp (ID INT IDENTITY(1,1) PRIMARY KEY, ' + STUFF((
    SELECT ', BYTE' + RIGHT('000' + CAST(sv.number AS VARCHAR(3)), 3) + ' INT'
    FROM [master].dbo.spt_values sv
    WHERE sv.[type] = 'p'
        AND sv.number BETWEEN 1 AND 236
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ')'

PRINT @SQL
EXEC sys.sp_executesql @SQL

输出 -

CREATE TABLE dbo.temp (ID INT IDENTITY(1,1) PRIMARY KEY, BYTE001 INT, BYTE002 INT, BYTE003 INT, BYTE004 INT, BYTE005 INT, BYTE006 INT, BYTE007 INT, BYTE008 INT, BYTE009 INT, BYTE010 INT, BYTE011 INT, BYTE012 INT, BYTE013 INT, ... , BYTE235 INT, BYTE236 INT)
于 2013-09-25T10:10:01.250 回答
2

现在我写了这段代码:

USE sip_audi_01
DECLARE @Columname varchar(10)
DECLARE @integer int
DECLARE @query VARCHAR(MAX)
SET @integer = 0
SET @Columname = 'BYTE'
SET @query='ALTER table tbl_Archiv_BYTEsps ADD '+@Columname+' int'
WHILE @integer = 235
BEGIN
  SET @integer = @integer + 1
  SET @Columname = @Columname + CAST(@integer AS char)
  EXEC (@query)
  PRINT 'Nummer:' + CAST(@integer AS char)
END;

但什么都没有发生......我可以在哪里读取 SQL-Server ManagementStudio 中的打印输出?@Devart,抱歉,您的代码对我来说太难了。

于 2013-09-26T11:18:01.840 回答
0

您需要使用动态 sql 来执行此查询。

DECLARE @query VARCHAR(MAX)

SET @query='ALTER table tbl_Archiv_BYTEsps ADD '+@Columname+' int'
EXEC (@query)

但我认为最好检查您的表结构,因为为一个表维护 236 列似乎有点混乱。

于 2013-09-25T10:04:59.380 回答