2015-06-10 55 views
0
DECLARE @COLNAME VARCHAR(100) 
DECLARE @CREATE VARCHAR (1000) 
DECLARE @TYPE VARCHAR(1) 
SET @COLNAME = '' 
SET @TYPE = 5 
SET @CREATE = 'CRATE TABLE TABLE_TYPE_' + @TYPE + '(' 


DECLARE MyCursor CURSOR FOR 
SELECT Name FROM LAYOUT WHERE RecordType = @TYPE 
ORDER BY Start 

OPEN MyCursor 
FETCH NEXT FROM MyCursor INTO @COLNAME 


    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    SET @COLNAME = REPLACE(@COLNAME, 'WX-', '') 
    SET @COLNAME = REPLACE(@COLNAME, '(', '') 
    SET @COLNAME = REPLACE(@COLNAME, ')', '') 
    SET @CREATE = @CREATE + '[' + @COLNAME + ']' + ' VARCHAR(1000),' 
    FETCH NEXT FROM MyCursor INTO @COLNAME 
    END 


    CLOSE MyCursor 
    DEALLOCATE MyCursor 
    SET @CREATE = LEFT(@CREATE, len(@CREATE) -1) + ')' --get rid of last comma 
    PRINT (@CREATE) --EXEC (@CREATE) 

看起来好像MS上有最大限制。当我打印@CREATE时,许多行被切断。 EX。有300列,但不知何故,它只能打印多达200列 如何在没有任何中断的情况下创建表格语句。无法执行光标生成语句

我知道有些人会建议不要使用游标,但由于一个表的列数太多,因此输入所有列名称将非常耗时。

回答

3

你真的不应该为此使用游标。 它不仅是可能的,而不光标做的,它更简单:

DECLARE @CREATE VARCHAR (max), 
     @TYPE int = 5 

SET @CREATE = 'CRATE TABLE TABLE_TYPE_' + CAST(@TYPE as varchar) + '(' 

SELECT @CREATE = @CREATE + REPLACE(
      REPLACE(
       REPLACE([Name], 'WX-', ''), 
      '(', ''), 
     ')', '') + ' VARCHAR(1000),' 
FROM Layout 
WHERE RecordType = @TYPE 

SET @CREATE = LEFT(@CREATE, len(@CREATE) -1) + ')' --get rid of last comma 

PRINT @CREATE 

see fiddle here