删除用户定义的表类型中的行

时间:2013-11-28 08:51:25

标签: sql sql-server stored-procedures

我有以下类型:

CREATE TYPE [dbo].[locationTable] AS TABLE(
[location_id] [varchar](100) NULL,
[name] [nvarchar](100) NULL,
[address] [varchar](100) NULL,
[latitude] [varchar](100) NULL,
[longitude] [varchar](100) NULL,
[distance] [varchar](100) NULL,
[state] [varchar](100) NULL,
[sub_cat] [varchar](100) NULL,
[idCat] [varchar](100) NULL,
[icon_link] [varchar](100) NULL,
[checkinsCount] [int] NULL
)
GO

并且我将一个表作为具有上述类型的参数传递给存储过程...但我需要在我的存储过程中从该表中删除一些行,但我不断得到它无法修改.... sql总是请求将表定义为只读,在这种情况下我无法修改

1 个答案:

答案 0 :(得分:2)

存储过程的表参数必须是只读的。 MSDN says

  

请注意,声明表值参数需要READONLY关键字。

您可以通过将内容复制到本地表变量来解决这个难题。例如:

if exists (select * from sys.procedures where name = 'TestProc')
    drop procedure TestProc
if exists (select * from sys.types where name = 'TestType')
    drop type TestType
go
create type TestType as table (id int, name varchar(20))
go
create procedure dbo.TestProc
    @par TestType readonly
as
declare @t TestType

insert @t select * from @par

delete @t where id = 2

select * from @t
go
declare @p1 TestType
insert @p1 values (1,'a'), (2,'b'), (3,'c');
exec dbo.TestProc @p1