2015-06-10 2 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 столбцов. Как я могу сопоставить инструкции create table без каких-либо обрезков.Невозможно выполнить оператор create с помощью курсора

Я знаю, что некоторые люди подскажут, что не используйте курсор, но поскольку для одной таблицы так много столбцов, потребуется много времени, чтобы вывести все имена колонок.

ответ

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

Смежные вопросы