2015-12-22 4 views
4

У меня возникают проблемы с динамическим созданием таблицы и ее вставкой. Я пробовал это несколько способов и не могу добиться желаемого результата. Ниже приводится упрощенная версия того, что я пытаюсь сделать. Обратите внимание, что это только одна попытка - я тоже пробовал другие (например, INSERT INTO [table] EXEC(@exe)).TSQL - динамическая таблица создания и вставка

Каждый раз, когда я пытаюсь ниже, я получаю сообщение

Команда (ы) успешно завершена

, но ни одна таблица не была даже создана.

Я использую SQL Server 2008 R2.

DECLARE @sqlText nvarchar 

SET @sqlText = 
N' 
IF OBJECT_ID(''[BudgetProcedures].dbo.UnitOccupancy'', ''U'') IS NOT NULL 
DROP TABLE [BudgetProcedures].dbo.UnitOccupancy; 

CREATE TABLE [BudgetProcedures].dbo.UnitOccupancy (Property varchar(15) 
                ,Unit varchar(15) 
                ,YearLength varchar(15) 
                ,Lease varchar(15)); 

INSERT INTO [BudgetProcedures].[dbo].[UnitOccupancy] (Property, Unit, YearLength, Lease) 

(SELECT ''ExProp'' 
,''ExUnit'' 
,''ExYrlen'' 
,''ExLease'' 
) 
' 

EXEC(@sqlText) 
+2

Не знаете, почему вам нужно использовать динамический sql здесь, но проблема в том, что вы не указали длину для своей переменной.Всякий раз, когда вы делаете динамический sql, вы должны ВСЕГДА выбрать его перед выполнением, чтобы вы могли видеть, что вы на самом деле выполняете. –

ответ

5

Вы должны объявить:

DECLARE @sqlText nvarchar(1000) 

Другой способ имеет длину 1 по умолчанию. И так как у вас есть новая строка в начале инструкции, она не бросает исключение синтаксиса (ваш запрос содержит только новый символ строки и является законным). Удалите новую строку, и вы получите сообщение об ошибке.

https://msdn.microsoft.com/en-us/library/ms176089.aspx

При п не указана в определении данных или переменной заявление, длина по умолчанию 1.

Вы можете использовать:

print @sqlText 

в посмотрите, как выглядит ваше утверждение.

+0

Благодарим вас за помощь и объяснение этого Георгия. Я также должен спросить - знаете ли вы, что делать, когда переменная превышает максимальную длину? В моем подлинном скрипте (не указанном по длине) nvarchar (max) терпит неудачу, потому что он не фиксирует всю строку. –

+0

@ E.Monk, set @v = N'split 'set @v = @v + N'it' –

+0

@ E.Monk: максимальная длина 'nvarchar (max)' составляет ** 1 миллиард символов ** - Я почти не верю, что вы действительно исчерпали этот предел! –

4

я смог успешно протестировать скрипт, когда я изменил это:

DECLARE @sqlText nvarchar 

Для этого:

DECLARE @sqlText nvarchar(max) 
0

Вы также можете попробовать это: вместо того, чтобы использовать локальную переменную, а затем его выполнения , вы можете быстро выполнить запрос динамически с помощью оператора exec, как показано ниже:

EXEC ('IF OBJECT_ID (' '[BudgetProcedures] .dbo.UnitOccupancy' ',' 'U' ') НЕ НУЛЛ ТАБЛИЦА DROP [BudgetProcedures] .dbo.UnitOccupancy;

CREATE TABLE [BudgetProcedures] .dbo.UnitOccupancy (VARCHAR Свойство (15) , Раздел VARCHAR (15) , YearLength VARCHAR (15) , аренда VARCHAR (15));

INSERT INTO [BudgetProcedures]. [DBO]. [UnitOccupancy] (Свойство, Unit, YearLength, лизинг) (SELECT '' ExProp ''
, '' ExUnit '' , '' ExYrlen '' , '' ExLease '' ) ')

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