总之,我有一个很大的(不可避免的)动态SQL查询.由于选择标准中的字段数,包含动态SQL的字符串增长超过4000个字符.现在,我知道有一个4000最大值设置NVARCHAR(MAX),但查看Server Profiler中执行的SQL语句
DELARE @SQL NVARCHAR(MAX);
SET @SQL = 'SomeMassiveString > 4000 chars...';
EXEC(@SQL);
GO
Run Code Online (Sandbox Code Playgroud)
似乎工作(!?),对于另一个同样大的查询,它会抛出一个与此4000限制(!?)相关的错误,它基本上修剪了这个4000限制之后的所有SQL,并且给我留下了语法错误.尽管这样的探查,它表示在这个动态的SQL查询全(!?).
究竟发生了什么,我应该将这个@SQL变量转换为VARCHAR并继续使用它吗?
谢谢你的时间.
PS.能够打印超过4000个字符来查看这些大查询也是很好的.以下限制为4000
SELECT CONVERT(XML, @SQL);
PRINT(@SQL);
Run Code Online (Sandbox Code Playgroud)
还有其他很酷的方式吗?
sql sql-server variables string-concatenation sql-server-2008
我可以使用以下代码进行微小的查询:
DECLARE @sql VARCHAR(8000)
SET @sql = 'SELECT * FROM myTable'
Exec @sql
Run Code Online (Sandbox Code Playgroud)
上面的方法对于维护大量代码非常有用,特别是当我们需要进行一次更改并将它们反映到任何地方时.
我的问题是我想要提供给@sql变量的查询(它只有一个查询)使用超过25个表连接,其中一些在临时表变量上,包含复杂的操作,因此长度超过8000个字符.
我希望使用TEXT数据类型来存储此查询,但MSDN显示一条警告消息,Microsoft正计划从其下一版本中删除Text,NText和Image数据类型.我希望我的代码也能在未来运行.
我想将这个查询存储在一个单独的文件中,但由于它使用表变量和其他特定于过程的参数的连接,我怀疑这是否可行.
请告诉我一个将大型查询存储到变量中并在过程中多次执行的方法.
我的查询量很大,因此无法按规则在生产中使用链接服务器。我通过了一个varchar(max)有8000个字符以上的字符。
但sp_executesql不支持超过8000个字符,那么我该如何执行我的字符串?
我在存储过程中创建一个动态查询,当我尝试打印该动态查询时,它只打印整个查询的一部分.
我的变量包含整个动态查询,如下所示
DECLARE @SQL NVARCHAR(MAX)
Run Code Online (Sandbox Code Playgroud)
当我像下面那样打印变量的长度时,它给出了整个查询的长度,这很好.
PRINT LEN(@SQL)
Run Code Online (Sandbox Code Playgroud)
但是,当我打印脚本本身时,它只打印整个查询的一部分.
PRINT @SQL
Run Code Online (Sandbox Code Playgroud)
我也尝试打印它如下
PRINT CONVERT(NVARCHAR(MAX),@SQL)
Run Code Online (Sandbox Code Playgroud)
为什么它只打印第一个4000chars?我究竟做错了什么?