【问题标题】:Editable table-valued in SQL ServerSQL Server 中的可编辑表值
【发布时间】:2014-01-01 10:45:11
【问题描述】:

我有一个带有 4 个参数的存储过程作为一个表(以前创建为用户定义的表类型)和 sql management studio 强制声明为只读,但我想传递这个参数并且我想做更新(我已经为它声明了一些字段为空)一些行,有人可以帮助我吗?

     @TEMP as TEMP READONLY

 The table-valued parameter "@TEMP" must be declared with the READONLY option.

谢谢。

【问题讨论】:

  • 不是管理工作室强迫您将其声明为只读 - 这是 SQL Server 的规则。如果你想要一个可操作的表,那么你需要创建一个相同类型的局部变量并复制行。

标签: sql sql-server parameter-passing


【解决方案1】:

对不起,他们是READONLY。时期。

@Damien 指出了一个有效的解决方法:如果要操作数据,则需要将它们复制到可编辑的结构中,例如表变量或#temp 表。哎呀,您甚至可以创建一个单独的表类型,将数据转储到那里,然后对其进行操作:

CREATE TYPE dbo.Integers AS TABLE(id INT PRIMARY KEY);
GO

CREATE PROCEDURE dbo.ProcessIntegers
  @x dbo.Integers READONLY
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @y dbo.Integers;

  INSERT @y SELECT id FROM @x;

  UPDATE @y SET id += 1;

  SELECT id FROM @y;
END
GO

DECLARE @z dbo.Integers;
INSERT @z VALUES(1),(2);
EXEC dbo.ProcessIntegers @x = @z;

虽然那里有一个额外的数据副本,但这仍然为您提供了首先通过 TVP 的好处,并且允许您对其进行操作。

想了解更多背景知识和解决方法的更多详细信息吗?阅读this article by Erland Sommarskog,可能还有this one too

哦,请对此 Connect 项目发表评论并投票,呼吁能够针对 TVP 执行 DML:

Connect #299296 : Relax restriction that table parameters must be readonly when SPs call each other

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2013-03-27
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多