【问题标题】:Stored procedure passing parameter MAX size Limite存储过程传递参数 MAX 大小限制
【发布时间】:2013-02-24 06:13:36
【问题描述】:

我正在使用 Microsoft SQL Server 2005

我创建了用于生成报告的存储过程。

ASP.NET from 用于为存储过程传递参数。

问题是它没有采用为参数选择的所有 PartNumber。它只需要 225 个 PartNumber 并只为那些 partNumber 生成报告,但实际上我有超过 700 个 PartNumber。

还有其他方法可以扩展参数的大小吗?

sql server 2008 有更多的大小限制吗?

有没有办法将这个“@sqlQuery nvarchar(4000)”变量存储到 XML 变量中?

4000 是 nvarchar 的最大大小(因为我试图扩展它并且它不接受超过 4000)。 xml变量没有限制。

参数值示例(从 ASP.NET 传递)

PartNumber
314013        
314039       
314047        
314054     
314062        
314070      
314088         
314096         
314104       
314344        
314351    
314377        
314393       

存储过程

USE [Reportbox]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[spCreateReport2]

(@prod nvarchar(4000))

AS
BEGIN

DECLARE @sqlQuery nvarchar(4000)
declare @intMonth nvarchar(2)
declare @intMonth1 nvarchar(2)
declare @intMonth2 nvarchar(2)
declare @intMonth3 nvarchar(2)
declare @intMonth4 nvarchar(2)
declare @intMonth5 nvarchar(2)

SELECT @intMonth = fiscalmonth FROM FiscalWeeks WHERE CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) between weekstart and weekend
if @intmonth-1<=0 BEGIN set @intmonth1=@intmonth-1+12 END else set @intMonth1=@intMonth-1
if @intmonth-2<=0 BEGIN set @intmonth2=@intmonth-2+12 END else set @intmonth2=@intmonth-2
if @intmonth-3<=0 BEGIN set @intmonth3=@intmonth-3+12 END else set @intmonth3=@intmonth-3
if @intmonth-4<=0 BEGIN set @intmonth4=@intmonth-4+12 END else set @intmonth4=@intmonth-4
if @intmonth-5<=0 BEGIN set @intmonth5=@intmonth-5+12 END else set @intmonth5=@intmonth-5

Set @sqlQuery =
'select distinct d.PROD80, DESC80, SUM_AVGU80, AVGU80, SUM_ONHA80, d.ONHA80, SUM_SAFE80, d.SAFE80,
MAX_FOQT80, MAX_ABCC80, MAX_MINQ80,
SUM_WEEK_NO_PO, SUM_TRIG80, d.TRIG80, SUM_BQTY80, DQTY80, OQTY80,
CASE WHEN d.AVGU80<>0 THEN CAST(ROUND(d.ONHA80/d.AVGU80,0) AS INT) ELSE 0 END AS WKS30
FROM DI80ACT00 d INNER JOIN vwDataAtCompanyLevel v on (d.prod80=v.prod80)
LEFT OUTER JOIN DI80ACT01 t on (d.prod80=t.prod80) and t.ware80 <> ''30''
WHERE  d.prod80 in (' + @prod + ') and d.prod80<>''HLW54B'' and d.ware80=''30''
GROUP BY  d.PROD80, DESC80, SUM_AVGU80, AVGU80, SUM_ONHA80, d.ONHA80, SUM_SAFE80, d.SAFE80,
MAX_FOQT80, MAX_ABCC80, MAX_MINQ80,SUM_HSTA80,SUM_HSTB80,SUM_HSTC80,SUM_HSTD80,SUM_HSTE80,SUM_HSTF80,SUM_POOR80,POOR80,SUM_TWIN80,SUM_WEEK_No_PO,SUM_TRIG80,TRIG80,SUM_BQTY80,DQTY80,OQTY80'

exec(@sqlQuery)
END

任何帮助或细节都会非常有帮助 谢谢

【问题讨论】:

    标签: asp.net tsql sql-server-2005 stored-procedures report


    【解决方案1】:

    使用支持超过 10 亿个字符的 NVARCHAR(MAX)。但是,我真的不希望您针对 700 个值的 IN() 查询能够很好地执行。

    如果他们选择ALL,则将字符串'ALL' 传递给参数,并且仅在他们没有选择ALL 时包含IN() 列表。所以在 SQL 中:

    Set @sqlQuery = 'select distinct 
    ...
    WHERE d.prod80<>''HLW54B'' and d.ware80=''30'''
    + CASE WHEN @prod = 'ALL' THEN '' ELSE 
    'AND d.prod80 in (' + @prod + ')' END
    + 'GROUP BY ...'
    

    没有理由有一个庞大的IN() 子句来列出表中的每个值。

    【讨论】:

    • 很难想象您“已经尝试过”的内容...您是否更改了 @prod 参数 AND @sqlQuery 变量?
    • 另外,这是所有的部件号吗?还是用户真的点击并选择了 700 个不同的零件编号并遗漏了一些?
    • 用户可以选择他们想要的任何零件编号。
    • 用户选择了所有选项
    • 最大零件编号选择可以超过 700
    猜你喜欢
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多