Sql server 用于生成SQL Server 2008R2动态查询的NVARCHAR(MAX)变量仅接受4000个字符

Sql server 用于生成SQL Server 2008R2动态查询的NVARCHAR(MAX)变量仅接受4000个字符,sql-server,tsql,nvarchar,Sql Server,Tsql,Nvarchar,你能帮助我理解这个奇怪的NVARCHAR变量行为吗 我正在构建一个dSQL查询,其范围为LEN()约6700到6900个字符,并将其存储在一个变量中: DECLARE @SQL NVARCHAR(MAX), @WhereClause NVARCHAR(MAX) = 'WHERE 1 = 1 ', @OrderByClaose NVARCHAR(MAX) SET @SQL = 'SELECT <column list> FROM

你能帮助我理解这个奇怪的
NVARCHAR
变量行为吗

我正在构建一个dSQL查询,其范围为
LEN()
约6700到6900个字符,并将其存储在一个变量中:

DECLARE 
   @SQL           NVARCHAR(MAX),
   @WhereClause   NVARCHAR(MAX) = 'WHERE 1 = 1 
',
   @OrderByClaose NVARCHAR(MAX)
SET @SQL = 
'SELECT
    <column list>
FROM
    <very complicated FROM clause>
 '
然后附加到@SQL的末尾

整个
@SQL
很好地打印
,然后使用
sp_executesql
顺利执行

因此,客户自然需要进行一些更改,从而导致漂亮的常量字符串被分成几段。这是将动态列部件添加到“选择列”列表中间的IF语句所必需的

SET @SQL = '
SELECT <code through first few columns>
...
'  

IF <condition>
   SET @SQL = @SQL + 
'    <new dynamic column spec stuff A> 
'
ELSE
    SET @SQL = @SQL + 
'    <new dynamic column spec stuff B> 
'

SET @SQL = @SQL + ' <next block of constant chars>'
...
一切都很顺利

虽然我还没有测试它,但我想知道这个解决方案对这个特定任务有效的唯一原因是否是因为我最大可能的dSQL语句中的字符数小于8000个字符

我看了几篇文章,包括

但我所发现的似乎无法解释我观察到的这种特殊dSQL构造的行为


知道这里的工作原理吗?

首先,因为您有一个
NVARCHAR
数据类型,所以应该始终使用
N'.'
格式(带前导
N
前缀)来清楚地表示Unicode字符串文字

DECLARE @WhereClause NVARCHAR(MAX) = N'WHERE 1 = 1'
其次,如果这一点本身没有帮助,请尝试在连接之前将字符串文本强制转换为
NVARCHAR(MAX)

IF <condition>
   SET @SQL = @SQL + CAST(...... AS NVARCHAR(MAX))
IF
设置@SQL=@SQL+CAST(……为NVARCHAR(最大))

不确定问题出在哪里。既然您需要将nvarchar传递给sp_executesql,为什么不从一开始就使用nvarchar呢?首先,既然您有一个
nvarchar
,那么您应该始终使用
N'.'
格式(带有前导的
N
前缀)来清楚地表示Unicode字符串文字。其次,如果这一点没有帮助,请尝试在连接之前将字符串文本转换为
NVARCHAR(MAX)
。您的第二个链接()解释了这种确切的行为,以及如何克服它。否???@Sean Lange我最初确实将SQL声明为NVARCHAR,如伪代码的第一位所示。@marc_s我没有尝试你的建议。我给他们打一针。
DECLARE @WhereClause NVARCHAR(MAX) = N'WHERE 1 = 1'
IF <condition>
   SET @SQL = @SQL + CAST(...... AS NVARCHAR(MAX))