可编辑的SQL Server表值

时间:2013-12-13 15:40:09

标签: sql sql-server parameter-passing

我有一个存储过程,有4个参数作为表(通常创建为用户定义的表类型)和sql管理工作室强制声明为READ ONLY,但我想传递此参数,我想做更新(我已经为它声明了一些空字段)某些行,有人可以帮助我吗?

     @TEMP as TEMP READONLY

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

感谢。

1 个答案:

答案 0 :(得分: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