2010-07-06 4 views
3

Я помню, как в тот день я сделал бы целый wack of nvarchar(4000) vars, проверял их длину по мере их роста, выключал их, когда они заполнялись, а затем объединял весь беспорядок вместе для вызова exec. Мне было интересно, есть ли более простой способ сделать это.Как выполнить очень длинный динамический SQL-запрос?

Спасибо!

Edit:

Пример кода, показывает мне прищурив случай заявление

DECLARE @sql NVARCHAR(MAX) 
SELECT @sql = CAST(N'SELECT ' AS NVARCHAR(MAX)) 

DECLARE @Index INT 
SELECT @Index = 0 

WHILE (@Index < 1000) 
BEGIN 
SELECT @sql = CAST(@sql AS NVARCHAR(MAX)) + CAST(N'   ' AS NVARCHAR(MAX)) + CAST(CASE @Index WHEN 1 THEN N' ' END AS NVARCHAR(MAX)) 
SELECT @Index = @Index + 1 
END 
SELECT @sql = CAST(@sql AS NVARCHAR(MAX)) + CAST(1 AS NVARCHAR(MAX)) 

SELECT LEN(@sql) 
EXECUTE sp_executesql @sql 
+7

Возможно, я не понимаю этот вопрос, но почему бы не использовать переменную nvarchar (MAX) - (SQL 2005 и выше)? – Tommy

+0

В чем вопрос? Dynamic SQL означает конкатенацию строк ... –

+1

@Tommy - добавьте свой комментарий в качестве ответа. Пятно на – AdaTheDev

ответ

6

sp_executesql принимает параметр типа NVARCHAR (MAX), который может вырасти до 2 Гб. Там нет необходимости в какой-либо трюк, так как тип NVARCHAR (MAX) поддерживает все операции со строками (конкатенацию, замена и т.д.):

[ @statement= ] statement

Is a Unicode string that contains a Transact-SQL statement or batch. 

утверждение должно быть либо константой Unicode или переменная Unicode. Более сложные выражения Unicode, такие как , объединяющие две строки с оператором + , не допускаются. Символы константы не допускаются. Если указана константа Unicode , она должна быть с префиксом N. Например, константа Unicode N'sp_who 'равна , но постоянная символа ' sp_who 'не является. Размер строки ограничен доступным только память сервера базы данных. На 64-битных серверах размер строки ограничен 2 ГБ, максимальный размер nvarchar (макс.).

+0

Будем надеяться, я получаю, чтобы развернуть это приложение на SQL Server 2005 + –

+0

Просто быть внимательными некоторых строковых функций: DECLARE @x NVARCHAR (макс) SET @ x = REPLICATE ('a', 10000) SELECT LEN (@x) - 8000 - должен быть SET @x = REPLICATE (CAST ('a' AS nvarchar (max)), 10000) –

+0

Я все еще могу 't получить мой NVARCHAR (MAX) var выше 4k символов. :( –

2

EXEC (@YourSQL)

ИЛИ

sp_exectesql, если вы хотите продолжать строить на ваш динамический SQL и выполнить.

=)