Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL长动态查询被切断_Sql_Tsql_Sql Server 2008 - Fatal编程技术网

T-SQL长动态查询被切断

T-SQL长动态查询被切断,sql,tsql,sql-server-2008,Sql,Tsql,Sql Server 2008,我正在处理一个将生成html页面的查询。在开始时,该页面只是一个带有标记的简单HTML表。这些标记稍后将被处理并替换为子查询(主要是标量函数)。通过这种方式,带有替换标记的HTML将与sp_executesql一起执行,以生成最终的HTML 该HTML的摘录: ...Arial, Helvetica, Verdana, sans-serif; font-weight: bold;">Firma:</td><td style="font-size: 14px; font-f

我正在处理一个将生成html页面的查询。在开始时,该页面只是一个带有标记的简单HTML表。这些标记稍后将被处理并替换为子查询(主要是标量函数)。通过这种方式,带有替换标记的HTML将与sp_executesql一起执行,以生成最终的HTML

该HTML的摘录:

...Arial, Helvetica, Verdana, sans-serif; font-weight: bold;">Firma:</td><td style="font-size: 14px; font-family: Arial, Helvetica, Verdana, sans-serif;">'+(select cast(coalesce(Companyname,'') as nvarchar(max)) as result from Customer WHERE CustomerID=988082)+'</td></tr><tr><td style="font-size: 14px; font-family: Arial, Helvetica, Verdana, sans-serif; font-weight: bold;">Anrede:</td><td style="font-size: 14px; font-family: Arial, Helvetica, Verdana, sans-serif;">'+(select cast(coalesce(Anrede,'') as nvarchar(max)) as result from Customer WHERE CustomerID=988082)+'</td></tr><tr><td style="font-size: 14px; font-family: Arial, Helvetica, Verdana, sans-serif; font-weight: bold;">Vorname:</td><td style="font-size: 14px; font-family: Arial, Helvetica, Verdana, sans-serif;">'+(select cast(coalesce(Firstname,'') as nvarchar(max)) as result from Customer WHERE CustomerID=988082)+'</td></tr><tr><td style="font-size: 14px; font-family: Arial, Helvetica, Verdana, sans-serif; font-weight: bold;">Nachname:</td><td style="font-size: 14px; font-family: Arial, Helvetica, Verdana, sans-serif;">'+(select cast(coalesce(Lastname,'') as nvarchar(max)) as result from Customer WHERE CustomerID=988082)+'</td></tr><tr><td style="font-size: 1...
假设这是LEN=9043个字符,注意AAA,如果我在那里添加字符,最终结果将保持为LEN=9043,但是如果我在最开始添加一些字符串,字符串大小将随着我在那里添加的字符串数量的增加而改变

结果将通过以下方式切断:

some stringresult of some function another stringresult of antoher function
 another stringresult of antoher function another stringresult of antoher 
function another stringresult of antoher function another stringresult of antoher
 function another stringresult of antoher function another ...ult of antoher function
你能看到那些。。。点几乎在结果的末尾,在那里我缺少了字符串的其余部分,应该在输出中大约12000,我有9043

更新2


因为这些都是自动电子邮件系统的一部分,而且它正在运行,所以我必须找到解决方案,我所做的就是从结果表中删除一些样式信息。所以在剪切了1/3的html之后,我最终得到了预期的结果,但因为最终字符串的大小取决于客户购买了多少产品,所以这个问题肯定会再次出现。我也想知道这种行为的原因是什么,以及如何克服它。

将修剪尾随空格,而不是。选择len'a',datalength'a'。因此,如果您将该字母向后插入100个字符,则最后一个字符是空格。只需使用DATALENGTH,就可以得到预期的结果

我在以字符串形式生成大型html输出时回忆起类似的事情。我想不起到底是什么问题,可能是管理工作室的一些限制。解决方法是将表生成为xml。下面是一个你可以尝试的例子。首先生成sql表,然后替换select*from值。。用你的桌子

declare
 @baseTable xml = (select * from ( Values
   (123, 'Firma:', 'Google'),
   (123, 'Anrede:', 'NYC'),
   (123, 'Vorname:', 'John'),
   (123, 'Nachname:', 'Doe')
  ) T(CustID, property, Val)
 for XML PATH('row'), ELEMENTS XSINIL)

,@tblClass VARCHAR(100)
,@thClass VARCHAR(100) 
,@TRstyle VARCHAR(100) = 'font-size: 14px'
,@TDstyle VARCHAR(100) = 'font-size: 14px; font-family: Arial, Helvetica, Verdana, sans-serif; font-weight: bold'

 SELECT @tblClass AS [@class]  
    ,@thClass AS [thead/@class]
    ,@baseTable.query(
              N'let $first:=/row[1]
                return 
                <tr> 
                {
                for $th in $first/*
                return <th>{local-name($th)}</th>
                }
                </tr>') AS thead
            ,@baseTable.query(                 
               N'for $tr in /row
                 return 
                 <tr style="{sql:variable("@TRstyle")}">
                  {
                   for $td in $tr/*
                     return <td style="{sql:variable("@TDstyle")}">{string($td)}</td>
                  }
                 </tr>') AS tbody
    FOR XML PATH('table'),TYPE

我曾经在使用+=运算符连接长字符串时遇到过一个问题,那就是减少字符数


因此,使用@SQL=@SQL+N“一个非常长的文本”;已经解决了

问题几乎可以肯定的是,您的@BodyTXT可能是nvarcharmax,但您输入的内容却不是。通过设置@BodyTxt=a+b+c+d+,所有的连接都是先完成的,然后立即插入变量中。这很好,直到SQL因为类型强制或其他原因决定最新位的结果是nvarchar默认长度4000,而不是nvarcharmax,并截断其中的一部分

您可以遍历整个查询,检查所有内容并查找问题,但将串联分解为足够小的位可能会更简单,比如这样

declare @BodyTXT nvarchar(max)

set @BodyTXT =  N'select ''some string' + (select cast('result of some function' as nvarchar(max))) + 
N' another string' + (select cast('result of antoher function' as nvarchar(max)))

set @BodyTXT = @BodyTXT +
N' another string' + (select cast('result of antoher function' as nvarchar(max))) + 
N' another string' + (select cast('result of antoher function' as nvarchar(max))) + 
N' another string' + (select cast('result of antoher function' as nvarchar(max))) +

set @BodyTXT = @BodyTXT +
N' another string' + (select cast('result of antoher function' as nvarchar(max))) + 
N' another string' + (select cast('result of antoher function' as nvarchar(max))) + 
N' another AAA string' + (select cast('result of antoher function' as nvarchar(max))) + N''''

我知道这是一篇老文章,但仍然是当前的主题。 这只是供参考,以帮助任何需要帮助的人在这个问题上

我刚刚遇到了一个问题,设置为NVARCHARMAX的@SqlStr在SP_ExecuteSQL调用期间一直处于关闭状态,导致错误

对这个长脚本执行的唯一连接是@TableName,它被设置为NVARCHAR100

经过几个小时的调试,问题是由@tablename引起的

似乎当使用nvarchar而不是NVarcharmax时,SQL将其视为稍微不同的数据类型,并将长字符串削减到4000个字符


为了解决这个问题,我必须更改@Tablename以匹配nvarcharmax数据类型。

我知道,如果我使用的不是nvarcharmax,我的结果将被截断为4000-这不是真的,如果连接表达式右侧不包含nvarcharmax,它将被截断。现在将函数结果强制转换到nvarcharmax已经太晚了,您需要确保在函数内部强制转换。@GSerg这将是一项相当艰巨的任务,我认为在DB中使用的10个函数通常返回的字符不超过几个,要改为返回nvarcharmax。但你知道为什么我仍然得到9000个字符的回报吗?我的意思是这个数字让我困惑…谢谢你在看输出吗?尝试将查询输出设置为文本文件,然后查看文本文件的大小是否正确。中的输出窗口中的字符数有一定限制SSMS@scsimon是的,我使用了len,但是结尾没有空格,我可以添加更多的字符,它们会被一些东西吞没。我认为gserg所说的有道理,但现在我想知道为什么在这种情况下>9000为什么不超过4000?等等。我正在处理一个将生成html页面的查询?这绝对是错误的,除非它是用于报告目的的电子邮件。OP是作为NVarChar演员。From:返回指定字符串表达式的字符数,不包括尾随空格。不排除尾随空格。对于Unicode字符串,可以使用DataLength/DestringExpression/DataLength N获取字符长度。一般来说,数据长度
h Left Coalesce StringExpression,,1将返回每个字符的字节数。我同意@HABO,这就是我在回答中所说的。我不知道他们在哪里浇铸,但我在LEN修剪中添加了文档。但我只使用LEN向您证明,我在获得全长字符串时遇到了问题。但是好的,我现在就发布datalength结果字符串,我用它作为模板,用户用wyswyg编辑器创建,在后面,我必须获取该字符串并用子查询替换这些标记,你是说我应该为此使用xml数据类型吗?Mike,原来的帖子是这样的@DejanDozet,使用XML创建XHTML确实是一个好主意。长度几乎是无限的,您可以免费获得字符转义和验证。您可以检查链接的答案以找到一些工作示例。@dejan dozet如果您是从表/字符串生成HTML输出,内置的xml工具可能非常有用。至少你不必担心尺寸和类型。基于您最初的帖子,我假设您从表中的一些数据创建了一个html表。现在我不太确定用户输入和期望的输出是什么。用户是否复制/粘贴一些需要转换的html内容?您能提供实际输入/输出的示例吗?@MikeTwc,您好,Mike,用户正在构建模板,他们使用的占位符稍后将被子查询(如select dbo.some_function1246)替换,因此当使用sp_executesql执行时,它将提供最终结果/字符串。更新2对您的解释是否足够?我的意思是,实际输入与实际表相关,所以您可以;无论如何,我都不会执行它,谢谢…我也不知道如何使用XML实现这个目的?我有一个类似于带有占位符的模板字符串的东西,它将被子查询替换并执行以生成最终输出,请看我的问题更新2也许你是我的英雄!谢谢分享这个伴侣。我已经检查过查询中的所有函数都被强制转换为nvarcharmax,但是GSerg说这些函数必须是nvarcharmax,我可以;不要仅仅因为这个就转换这些函数,这是没有意义的,因为返回Post代码的函数应该只返回varchar5,因为这是正确的方法。它可能是SQL Server 2008中的某个东西吗?好吧,现在我想的不多,只是将所有东西都转换为nvarcharmax
declare @BodyTXT nvarchar(max)

set @BodyTXT =  N'select ''some string' + (select cast('result of some function' as nvarchar(max))) + 
N' another string' + (select cast('result of antoher function' as nvarchar(max)))

set @BodyTXT = @BodyTXT +
N' another string' + (select cast('result of antoher function' as nvarchar(max))) + 
N' another string' + (select cast('result of antoher function' as nvarchar(max))) + 
N' another string' + (select cast('result of antoher function' as nvarchar(max))) +

set @BodyTXT = @BodyTXT +
N' another string' + (select cast('result of antoher function' as nvarchar(max))) + 
N' another string' + (select cast('result of antoher function' as nvarchar(max))) + 
N' another AAA string' + (select cast('result of antoher function' as nvarchar(max))) + N''''