使用列定义表创建插入查询

时间:2015-06-04 19:57:42

标签: sql-server sql-server-2012

我有一个名为raw_data的表,其中包含一个列,其中包含一系列以固定长度子字符串格式化的数据字段。我还有一个表table_1,它为每个值指定列名和字符串中的数据范围。我需要创建一个SQL INSERT语句,将数据从raw_data移动到一个名为table_2的表中,并包含所有列。 table_1有大约600行,所以我想知道是否可以遍历每条记录来创建将数据插入table_2的SQL语句。

Table_1
    Name    Start    Length
    AAA       1       2
    BBB       3       3
    CCC       6       1

我还没有学会如何使用游标;以下查询可能不正确。此任务将涉及3个表。 table_1查找名称,开头,长度值。 table_2将是我需要将数据插入的表。第三个表raw_data的列包含每个所需值的子字符串。

 DECLARE @SQL VARCHAR(200) 
    DECLARE @NAME VARCHAR(200) 
    DECLARE @START VARCHAR(200)  
    DECLARE @LENGTH VARCHAR(200)
    SET @NAME = ''

    DECLARE Col_Cursor CURSOR FOR
    SELECT Name, Start, Length FROM ODS_SIEMENS_LAYOUT WHERE RecordType = '1'

    OPEN Col_Cursor
    FETCH NEXT FROM Col_Cursor INTO @NAME, @START, @LENGTH

    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @SQL =  @NAME  + '=' + 'SUBSTRING(RAW_DATA,' + @START + ',' + @LENGTH + ')'
    FETCH NEXT FROM Col_Cursor INTO @NAME, @START, @LENGTH
    END


    CLOSE Col_Cursor
    DEALLOCATE Col_Cursor

我需要生成类似下面的查询:

INSERT INTO TABLE_2
'AAA' = SUBSTRING(RAW_DATA,1,2)          
'BBB' = SUBSTRING(RAW_DATA,3,3)              
'CCC' = SUBSTRING(RAW_DATA,5,2)              
........

我可以遍历每一列以形成SQL语句而不是手动编码600列吗?

2 个答案:

答案 0 :(得分:1)

啊,我想我开始解开你想要做的事情。这里根本不需要游标或动态sql。您只需要使用select语句作为插入的值。这样的事可能吗?

INSERT INTO TABLE_2(AAA, BBB, CCC)
SELECT SUBSTRING(RAW_DATA,1,2)          
, SUBSTRING(RAW_DATA,3,3)              
, SUBSTRING(RAW_DATA,5,2)      
FROM ODS_SIEMENS_LAYOUT 
WHERE RecordType = '1'

答案 1 :(得分:1)

< p>冒着听起来像是< a href =“http://en.wikipedia.org/wiki/File:Clippy-letter.PNG”rel =“nofollow”> Clippy< / a> ..看起来你正试图导入一个平面文件。你的RAW_DATA来自某个平面文件吗?如果是这样,您可能会考虑使用批量插入:< / p> < p>< a href =“https://technet.microsoft.com/en-us/library/ms178129%28v=sql.110%29.aspx"rel =”nofollow“>使用格式文件批量导入数据< / a>< / p> < p>如果您只是问如何使用列定义表中的数据构建sql语句...那么您拥有的代码非常接近。你想要这样的东西:< / p> < pre>< code> DECLARE @COLUMNS varchar(max) DECLARE @SUBCOLUMNS varchar(max) DECLARE @NAME VARCHAR(200) DECLARE @START VARCHAR(200) DECLARE @LENGTH VARCHAR(200) SET @NAME ='' DECLARE Col_Cursor CURSOR FOR SELECT Name,Start,Length FROM ODS_SIEMENS_LAYOUT WHERE RecordType ='1' 打开Col_Cursor FETCH NEXT FROM Col_Cursor INTO @NAME,@ START,@ LENGTH 设置@SUBCOLUMNS ='' 设置@COLUMNS ='' WHILE @@ FETCH_STATUS = 0 开始 SET @COLUMNS = @COLUMNS + @NAME +',' SET @SUBCOLUMNS = @SUBCOLUMNS +'SUBSTRING(RAW_DATA,'+ @ START +','+ @LENGTH +'),' FETCH NEXT FROM Col_Cursor INTO @NAME,@ START,@ LENGTH 结束 关闭Col_Cursor DEALLOCATE Col_Cursor 设置@COLUMNS = LEFT(@COLUMNS,len(@COLUMNS)-1) - 删除最后一个逗号 设置@SUBCOLUMNS = LEFT(@SUBCOLUMNS,len(@SUBCOLUMNS)-1) - 删除最后一个逗号 print'INSERT INTO TABLE_2'+'('+ @COLUMNS +')SELECT'+ @SUBCOLUMNS +'FROM RawDataTable' < /代码>< /预> < p>您可以使用打印的文本并将该SQL语句插入到执行实际插入的过程中。< / p>