我有一个变量
,其中存储了SQL
字符串,并通过exec()
执行它。
Declare @sql varchar(max)
set @sql = Concat('select...',@var,'..') -- large string
exec (@sql)
但是我收到了一个错误,显示:
sometext 附近的语法不正确
这是因为变量 @sql
无法容纳整个字符串。所以我通过将字符串拆分为两个不同的变量并执行来解决它。
Declare @sql1 varchar(max),@sql2 varchar(max)
set @sql1 = 'select...'
set @sql2 = ' from sometable join....'
exec (@sql1+@sql2)
我检查了@sql1+ @sql2
的数据长度。
Select Datalength(@sql1+ @sql2)
它返回了14677
现在的问题是为什么varchar(max)
不能存储14677
字节的信息?当文档说明它可以存储高达2GB
数据时。
select @sql
来检查字符串是否真的正确? - juergen d--long string
的地方隐藏了一些罪行,比如使用+
结合多个短字符串字面量。假设使用 SQL Server 2008 或更高版本,varchar(max)
变量 实际上可以容纳超过 2GB 的数据。 - Damien_The_UnbelieverSelect @sql
时,它只返回字符串的一部分。 - Pரதீப்CONCAT
的文档也没有什么神秘的地方 - "如果没有任何输入参数是受支持的大型对象(LOB)类型,则返回类型将被截断为8000长度,无论返回类型如何"。如果我们能够看到包含错误的代码,而不是被迫猜测,那么我们更容易指出这些类型的错误。 - Damien_The_Unbeliever