SQL Server:使用动态查询时截断的存储过程参数

时间:2014-05-09 10:13:20

标签: sql-server

我使用的是动态存储过程,参数值非常长(超过8000个字符)。

另一个存储过程在动态查询(@SP)内部调用,当我执行SP时,参数被截断。

如何获取整个参数?我错过了什么吗?

因此我无法执行查询。

ALTER PROCEDURE [dbo].["SP_NAME"]
    @ID varchar(50),
    @<parameter> nvarchar(max), 
AS
   SET NOCOUNT ON

   DECLARE @SP nvarchar(MAX)
   set @SP = '

   DECLARE @sampleNVARCHAR nvarchar(MAX)
   SET @sampleNVARCHAR= '''+ @<parameter>+ '''

   EXEC <anotherSP> @sampleNVARCHAR,'+ cast(@CLIENTOFFSET as varchar(10)) +''

   EXEC sp_executesql @SP
   RETURN

4 个答案:

答案 0 :(得分:2)

8000字符限制不适用于NVARCHAR(MAX),如果您明确指定NVarchar(N),则可以指定最多 n = 4000 个字符如果您使用VARCHAR(N).

,则最多 N = 8000 个字符

NVarchar(MAX)Varchar(MAX)最多只能容纳65535个字节,超过20亿个字符。

如果抛出错误显示字符串截断消息,请检查内部存储过程内部是否存在截断错误。

答案 1 :(得分:2)

如果您使用nvarchar(max)变量进行连接,那么它将适用于您。

@SP设置为空字符串,并在连接表达式中使用@SP

declare @SP nvarchar(max);
set @SP = '';
set @SP = @SP + N'declare @sample....' + @Param

您可以在自己的计算机上或SQL Fiddle

中运行的测试
declare @SP nvarchar(max)
declare @Param nvarchar(max) = 'ParamString'

set @SP = replicate(N'X', 3000) + replicate(N'Y', 3000) + @Param
select len(@SP) -- Truncated to 4011 characters

set @SP = ''
set @SP = @SP + replicate(N'X', 3000) + replicate(N'Y', 3000) + @Param
select len(@SP) -- Not truncated, shows 6011 characters

答案 2 :(得分:2)

这可能是因为隐式转化

我们无法看到隐含的转化。 SQL Server自动将数据从一种数据类型转换为另一种数据类型。 例如,当smallint与int进行比较时,smallint会在比较进行之前隐式转换为int。

答案 3 :(得分:1)

而不是在动态查询的文本中插入参数也可以将它们作为参数传递,{> 1}}未在OP脚本中定义,值是发明的

@CLIENTOFFSET

查看ALTER PROCEDURE [dbo].["SP_NAME"] @ID varchar(50), @<parameter> nvarchar(max), AS SET NOCOUNT ON DECLARE @SP nvarchar(MAX) set @SP = ' DECLARE @sampleNVARCHAR nvarchar(MAX) SET @sampleNVARCHAR= @param EXEC <anotherSP> @sampleNVARCHAR, cast(@CLIENTOFFSET as varchar(10))' EXEC sp_executesql @SP, N'@param nvarchar(max), @CLIENTOFFSET int' , @param = @<parameter>, @CLIENTOFFSET = @ID RETURN 的完整定义technet page可能是最佳选择