SQL Server 2008 R2 Express上的表值参数READONLY错误

时间:2019-05-08 13:20:20

标签: sql-server table-valued-parameters

我有用户定义的表类型并使用了该类型的存储过程

create type dbo.ut_Type1(
        Col1 varchar(10),
        Col2 varchar(10),
        Col3 int) 
go
create procedure dbo.p_Procedure1(
        @TVP ut_Type1 READONLY,
        @Year int,
        @ID int)
as
begin

这是从客户端应用程序调用的

var td:TMSTableData;

......

TMSQuery1.SQL.Text:='exec dbo.p_Procedure1 @TVP = :Par1, @Year = :Par2, @ID = :Par3';
TMSQuery1.ParamByName('Par1').AsTable:=td.Table;
TMSQuery1.ParamByName('Par2').AsInteger:=2019;
TMSQuery1.ParamByName('Par3').AsInteger:=4605;

除一个特定的SQL Server之外,其他所有程序都工作正常。 这是从Profiler对该服务器的执行。 ( Microsoft SQL Server 2008 R2(SP2)-具有高级服务(64位)的10.50.4000.0(X64)Express Edition)

declare @p3 dbo.ut_Type1
insert into @p3 values('001','112',142)

exec sp_executesql N'exec dbo.p_Procedure1 @Table = @P1, @Year = @P2, @ID = @P3', N'@P1 dbo.ut_Type1,@P2 int,@P3 int',@p3,2019,4605

出错了

  

“表值参数@ P1必须使用READONLY选项声明”

我已经在类似的SQL Server上尝试了相同的调用( Microsoft SQL Server 2008 R2(SP2)-10.50.4042.0(X64) 具有高级服务的Express Edition(64位))。这是Profiler的执行

declare @p3 dbo.ut_Type1
insert into @p3 values('001','112',142)

exec sp_executesql N'exec dbo.p_Procedure1 @Table = @P1, @Year = @P2, @ID = @P3', N'@P1 dbo.ut_Type1 READONLY,@P2 int,@P3 int',@p3,2019,4605

没有得到错误。

唯一的区别是第一个服务器表值参数上缺少关键字READONLY。

我必须为SQL Server设置任何配置吗?
谢谢!

1 个答案:

答案 0 :(得分:0)

根据Microsoft文档的表参数具有以下限制:

  • SQL Server不会维护表值参数列的统计信息。
  • 表值参数必须作为输入READONLY参数传递给Transact-SQL例程。您无法对例程主体中的表值参数执行DML操作,例如UPDATE,DELETE或INSERT。
  • 您不能将表值参数用作SELECT INTO或INSERT EXEC语句的目标。表值参数可以位于SELECT INTO的FROM子句中,也可以位于INSERT EXEC字符串或存储过程中。