Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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 Server_Stored Procedures - Fatal编程技术网

Sql server 存储过程未按预期顺序返回行

Sql server 存储过程未按预期顺序返回行,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一个存储过程,它运行查询并将表结果保存在单独的表中。查询在StoredProcess中定义如下: BEGIN SET NOCOUNT ON; DECLARE @Command nvarchar(MAX) = N'', @Condition nvarchar(4000) = N''; SET @Command = @Command + N' SELECT * FROM( SELECT ROW_NUMBER() OVER(ORDER BY No,Account.AccCode) AS Row

我有一个存储过程,它运行查询并将表结果保存在单独的表中。查询在StoredProcess中定义如下:

BEGIN
SET NOCOUNT ON;
DECLARE @Command nvarchar(MAX) = N'', @Condition nvarchar(4000) = N'';
SET @Command = @Command + N'
SELECT * FROM(
  SELECT ROW_NUMBER() OVER(ORDER BY No,Account.AccCode) AS RowNo, 
     ParentAccount.AccCode AS ParentAccCode, ParentAccount.Description AS 
     ParentAccountDescription, Account.AccCode, Account.Description AS 
     AccountDescription, 
     Detail1.DetailCode AS Detail1Code, Detail1.Description AS 
     Detail1Description,AccDoc.No AS No,Account.AccCode
   FROM AccDoc 
     INNER JOIN AccDocDetail AS DocDetail ON AccDoc.Guid = 
     DocDetail.DocGuid
     LEFT JOIN Account ON Account.Guid = DocDetail.AccountGuid
     LEFT JOIN Account AS ParentAccount ON ParentAccount.Guid = Account.ParentGuid
     LEFT JOIN AccDetail AS Detail1 ON DocDetail.Detail1Guid=Detail1.Guid
      WHERE (AccDoc.Company = '391891BA-DCC9-4B76-9588-9C97E0C2071A') AND 
          (AccDoc.Branch = 'FDFCD806-787F-4BB9-9E3F-6E5A57D409E6') AND (AccDoc.Period = 'DA2C20CC-1132-4008-853E-E4FE6D85EF3A')
   ORDER BY No,AccCode'

PRINT @Command;
现在我定义一个表变量,并将其结果保存到:

    DECLARE @tempTable Table(RowNo int, ParentAccCode nvarchar(15),...) 
    INSERT INTO @tempTable
    EXECUTE sp_executesql @Command, N'@Company uniqueidentifier, @Branch uniqueidentifier, @Period uniqueidentifier, @StartTurning nvarchar(20), @EndTurning nvarchar(20),@StartDocumentNo nvarchar(20), @EndDocumentNo nvarchar(20),   @StartDate nvarchar(8), @EndDate nvarchar(8)',
        @Company = @Company, @Branch = @Branch, @Period = @Period, @StartTurning = @StartTurning, @EndTurning = @EndTurning, @StartDocumentNo = @StartDocumentNo, @EndDocumentNo = @EndDocumentNo, @StartDate = @StartDate, @EndDate = @EndDate;
最后,我在@tentable上运行了一个查询:

SELECT * FROM @tempTable
END
GO
查询结果保存在TENTRABLE..中,但sort of table不是真的。当我单独运行保存在@Command变量中的查询时,它的sort是真的:

ORDER BY No,AccCode
但是,当将其保存在单独的变量(@tentable)中并在其上选择时,记录的记录将被破坏

那是什么原因?我能做什么?

在磁盘上对数据进行排序的唯一方法或时间是基于。检索数据时,必须指定一个
排序依据
,否则无法保证结果

因此,您必须使用:

SELECT * 
FROM @tempTable
ORDER BY No, AccCode

不过,我不明白为什么要将这些数据转储到表变量中。他们的表现通常更差,因为他们的成绩很差。

你说这些记录的记录被打破是什么意思?那没有任何意义。为什么在这里使用动态语句,而它看起来没有任何动态变化。表排序基于“否”列。查询为true并返回true sort Table。但是当调用storedProcedure时,结果表的排序被破坏了。。!!如果“not true”和“breaked”的意思是
SELECT
没有按您想要的顺序返回行,请将查询更改为
SELECT。。。订购人
。按特定顺序插入表并不意味着从没有order BY的表中选择将产生相同的顺序。没有任何魔法可以保证SQL Server将按照您期望的顺序或您想要的顺序返回行,除非您明确地告诉它您期望的内容和您想要的内容。这个问题的标题应该是“存储过程以错误的顺序返回行”之类的。“不返回真值”听起来好像没有正确返回布尔真假值。这个StoredProcess比我写的要大。。因为它包括另一个部分,它是一个游标,可以更改记录的值。它必须返回已排序的记录,而不必重新排序。如果它必须返回已排序的记录,那么在选择它们时,您必须使用
order by
。我见过人们使用显式聚集索引(聚集主键)来提供默认顺序。我对此不满意,但他们不让我修复它。@ShapeOfMatter这不起作用,即使它一开始似乎起作用。正如Aaron Bertrand所提到的,在SQL Server上查询时,如果没有正确使用order BY子句,订单永远无法得到保证。即使假设默认排序基于聚集索引,也是不正确的,也不能保证。Brent Ozar在下面的链接中写了一篇关于它的文章。(长话短说,生成的查询计划通常规定返回结果的顺序,可以基于表上的任何索引,甚至根本不基于任何索引。)