2010-07-06 70 views
3

我记得在那天我会做的nvarchar(4000)瓦尔整体怪人,检查他们的,因为他们成长的长度,切换出来,因为他们填补了,然后一起串联全乱了exec调用。我想知道是否有更简单的方法。如何执行非常长的动态sql语句?

谢谢!

编辑:

代码示例,说明我搞砸了case语句

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)变量(s) - (SQL 2005及更高版本)? – Tommy 2010-07-06 21:38:34

+0

什么问题?动态SQL意味着字符串连接... – 2010-07-06 21:46:00

+1

@Tommy - 添加您的评论作为答案。现货上 – AdaTheDev 2010-07-06 21:52:38

回答

6

sp_executesql接受类型NVARCHAR(MAX),它可以长到2GB的参数。有没有需要任何噱头,因为NVARCHAR(MAX)类型支持所有的字符串操作(串联,更换等):

[ @statement= ] statement

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

语句必须是一个Unicode 不变或一个Unicode变量。更复杂的 Unicode表达式,如 连接两个字符串与+ 操作,是不允许的。不允许使用字符 常量。如果指定了一个 Unicode常量,则必须以 为前缀。例如, Unicode常量N'sp_who'有效,但字符常量 'sp_who'不是。所述 串的大小只受可用 数据库服务器内存的限制。在64位 服务器,所述字符串的大小是 限制为2 GB, 为nvarchar(最大值)的最大大小。

+0

让希望我得到部署SQL Server上的这种应用2005 + – 2010-07-06 22:46:40

+0

只是要留意的一些字符串函数: DECLARE @x为nvarchar(最大) SET @ X = REPLICATE( 'A',10000) SELECT LEN(@x) - 8000 - 需要设置@x = REPLICATE(CAST( 'A' AS为nvarchar(MAX)),10000) – 2010-07-07 01:35:06

+0

我还可以不要让我的NVARCHAR(MAX)var超过4k个字符。 :( – 2010-07-07 18:02:47

2

EXEC(@YourSQL)

OR

sp_exectesql如果您希望继续建立到你的动态SQL和执行。

=)