Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
Sql server 在sql 2000中存储大于4000的nvarchar_Sql Server_Sql Server 2000_Nvarchar - Fatal编程技术网

Sql server 在sql 2000中存储大于4000的nvarchar

Sql server 在sql 2000中存储大于4000的nvarchar,sql-server,sql-server-2000,nvarchar,Sql Server,Sql Server 2000,Nvarchar,我正在尝试使用@SumSQL var type nvarchar 4000执行sql,当我在存储过程中输入大于特定值(如“11”)的参数值时,程序返回sql错误。。。问题在于,当sql存储var@SumSQL it size中的字符变得大于4000时,之后它将不存储任何内容,在sql 2008中,如果我将nvarchar 4000的类型更改为nvarchar max,它的效果会很好,但sql 2000中不存在这种情况。下面是sql存储的一部分: DECLARE @SQL AS [nvarchar

我正在尝试使用@SumSQL var type nvarchar 4000执行sql,当我在存储过程中输入大于特定值(如“11”)的参数值时,程序返回sql错误。。。问题在于,当sql存储var@SumSQL it size中的字符变得大于4000时,之后它将不存储任何内容,在sql 2008中,如果我将nvarchar 4000的类型更改为nvarchar max,它的效果会很好,但sql 2000中不存在这种情况。下面是sql存储的一部分:

DECLARE @SQL AS [nvarchar](4000)     
            DECLARE @SumSQL AS [nvarchar](4000)       
            SET @SumSQL = ''     
            SET @SQL = ' ALTER TABLE [#t] ADD [TotalRemainingPrice] [FLOAT], [TotalRemainingQnt] [FLOAT], [MatUnitName] [nvarchar](256) COLLATE ARABIC_CI_AI, [AvgQty] [FLOAT], [AvgPrice] [FLOAT], [Price] [FLOAT]'     
            WHILE @PeriodCounter < @NumOfPeriods      
            BEGIN       
                SET @SQL = @SQL + ', [P' + CAST((@PeriodCounter+1) AS [nvarchar](10)) + '] [FLOAT]'        
                SET @SQL = @SQL + ', [r' + CAST((@PeriodCounter+1) AS [nvarchar](10)) + '] [FLOAT]'        

                SET @PeriodStart = @PeriodCounter * @PeriodLength      
                SET @PeriodEnd = @PeriodStart + @PeriodLength      

                IF @PeriodCounter = (@NumOfPeriods - 1) 
                        SET @SumSQL = @SumSQL +  ', ISNULL((SELECT SUM( [Remaining]) FROM [#In_Result] [t_inner] WHERE  [t_inner].[MatID] = [t_outer].[MatID] AND [t_inner].[Age] >' + CAST(@PeriodStart AS [nvarchar](10)) + '), 0)'      
                                    +    
                                    ', ISNULL((SELECT SUM( [Price] * [Remaining]) FROM [#In_Result] [t_inner] WHERE [t_inner].[MatID] = [t_outer].[MatID] AND [t_inner].[Age] > ' + CAST(@PeriodStart AS [nvarchar](10)) + '), 0)'       


                ELSE      
                BEGIN      
                    IF @PeriodCounter = 0    

                        SET @SumSQL = @SumSQL +  ', ISNULL((SELECT SUM([Remaining]) FROM [#In_Result] [t_inner] WHERE [t_inner].[MatID] = [t_outer].[MatID] AND ( [t_inner].[Age] = 0 OR ( [t_inner].[Age] > ' + CAST(@PeriodStart AS [nvarchar](10))       
                                    + ' AND [t_inner].[Age] <= ' + CAST(@PeriodEnd AS [nvarchar](10)) + '))), 0)'      
                                    +  
                                    ', ISNULL((SELECT SUM([Price] * [Remaining]) FROM [#In_Result] [t_inner] '      
                                    + ' WHERE [t_inner].[MatID] = [t_outer].[MatID]'      
                                    + ' AND ( [t_inner].[Age] = 0 OR ( [t_inner].[Age] > ' + CAST(@PeriodStart AS [nvarchar](10))       
                                    + ' AND [t_inner].[Age] <= ' + CAST(@PeriodEnd AS [nvarchar](10)) + '))), 0)'      


                    ELSE  

                        SET @SumSQL = @SumSQL +  ' , ISNULL((SELECT SUM([Remaining]) FROM [#In_Result] [t_inner] WHERE [t_inner].[MatID] = [t_outer].[MatID] AND [t_inner].[Age] > ' + CAST(@PeriodStart AS [nvarchar](10)) + ' AND t_inner.Age <= ' + CAST(@PeriodEnd AS [nvarchar](10)) + '), 0)'      
                        + ' , ISNULL((SELECT SUM([Price] * [Remaining]) FROM [#In_Result] [t_inner] WHERE [t_inner].[MatID] = [t_outer].[MatID] AND [t_inner].[Age] > ' + CAST(@PeriodStart AS [nvarchar](10)) + ' AND [t_inner].[Age] <= ' + CAST(@PeriodEnd AS [nvarchar](10)) + '), 0)'      

                END       
                SET @PeriodCounter = @PeriodCounter + 1     
            END 
            EXEC( @SQL) 
            DECLARE @SqlInsert AS [nvarchar](4000)
            DECLARE @SqlInsert2 AS [nvarchar](4000)
            SET @SqlInsert =  ' INSERT INTO [#t] SELECT [MatID], SUM([Price] * [Remaining]), SUM([Remaining]), [MatUnitName], [AvgQty], [AvgPrice], [Price1] ' --+ @SumSQL + 
            SET @SqlInsert2 =  ' FROM [#In_Result] [t_outer] GROUP BY [MatID], [MatUnitName],[AvgQty], [AvgPrice],[Price1]'     
            EXEC( @SqlInsert+@SumSQL+@SqlInsert2)  <--- here is where to execute stored nvarchar ! 
那么,在sql 2000中存储大于4000的nvarchar的最佳方法是什么呢?

如果确实必须使用2000版本,最好的选择是将数据类型从nvarchar 4000更改为。
如果可能的话,您应该向上司/客户施压,要求他们升级到较新版本的sql server。

现在已经不是升级服务器的时候了。我知道,即使扩展支持也结束了,但我们必须在年底前使用sql 2000,然后将更改为sql Server的2008 r2和2014版本谢谢,如果我们将nvarchar 4000更改为varchar8000,可以解决大部分问题。所有问候