【问题标题】:un-expected results returned from insert into exec stored_procedure()从插入到 exec stored_procedure() 返回的意外结果
【发布时间】:2013-06-19 13:53:10
【问题描述】:

我正在创建一个带有单个 nvarchar 列的临时表。我有一个返回字符串列表的存储过程。我想在顶部添加一条记录,在底部添加一条记录以及我的存储过程返回的数据。

这是我的 sp 代码 sn-p:

CREATE TABLE #tempData (col1 nvarchar(4000)) 
INSERT INTO #tempData values('SET IDENTITY_INSERT ['+@table_name+'] ON')
INSERT INTO #tempData EXEC (@Actual_Values)
INSERT INTO #tempData values('SET IDENTITY_INSERT ['+@table_name+'] OFF')
select * from #tempData
DROP TABLE #tempData

预期:

SET IDENTITY_INSERT ['+@table_name+'] ON
records returned from sp
SET IDENTITY_INSERT ['+@table_name+'] OFF

返回:

SET IDENTITY_INSERT ['+@table_name+'] ON
some records returned from sp
SET IDENTITY_INSERT ['+@table_name+'] OFF
remainingrecords returned from sp

为什么存储过程中的所有记录都不按顺序排列。我在哪里解释错了? 请原谅我的提问语言和长度。

【问题讨论】:

  • 您不应该期待 OFF 而不是 ON 作为第三个值吗?
  • 您如何确定它们“乱序”?如果您的#tempData 表只有一列,而您只是说“SELECT * FROM #tempData”,您是否希望结果按照插入行的顺序返回?这不是 SQL Server 的工作方式——将表视为一袋无序的行。如果您希望能够以某种形式的预期顺序返回数据,请添加一个 IDENTITY 列,并在您选择时按该列排序。
  • 为什么要投反对票。我的问题有什么问题?

标签: sql stored-procedures sql-server-2008-r2


【解决方案1】:

从表中选择时不保证顺序。如果您需要按顺序返回的字符串,则需要添加一个 order 列。你可以试试这个:

CREATE TABLE #tempData (ID int IDENTITY(1,1), col1 nvarchar(4000))
INSERT INTO #tempData values('SET IDENTITY_INSERT ['+@table_name+'] ON')
INSERT INTO #tempData EXEC (@Actual_Values)
INSERT INTO #tempData values('SET IDENTITY_INSERT ['+@table_name+'] OFF')
select * from #tempData ORDER BY ID
DROP TABLE #tempData

【讨论】:

  • 知道了。根据您的建议工作正常。我没有想到身份,因为 4 个表(有 20-30 条记录)按预期返回数据,而 2 个表(超过 2000 条记录)返回无序。感谢您的快速回复。
【解决方案2】:

你也可以试试

select * from #tempData
ORDER BY CASE WHEN RIGHT(col1,2) = 'ON' THEN 0
              WHEN RIGHT(col1,3) = 'OFF' THEN 2
              ELSE 1 END

假设您的 Sp 值不以 ONOFF 结尾

【讨论】:

  • 除非 OP 也关心这两个端点之间的语句顺序,在这种情况下,这还不够。我不确定是不是这样。
  • 感谢您的回复。但是,我的 sp 可能会返回以 ON / OFF 结尾的数据
  • 当然,你应该选择身份解决方案。我首先对这个答案投了赞成票,只是提供了一个额外的想法。
猜你喜欢
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多