c# - 如何在 SQL Server 2012 存储过程中声明表变量?
问题描述
我正在尝试创建一个存储过程,但出现以下问题:
消息 2715,级别 16,状态 3,过程 usp_UpatePriv,第 1 行列、
参数或变量 #1:找不到数据类型 tblScreen。参数或变量“@screen”的数据类型无效。消息 1087,级别 16,状态 1,过程 usp_UpatePriv,第 8 行
必须声明表变量“@screen”。
这是存储过程:
create procedure usp_UpatePriv
@screen tblScreen Readonly
as
declare @username nvarchar(50)
declare @prev bit
declare @idscreen bigint
declare privlange cursor for
(select username, idScren, Prev from @screen)
open privlange
fetch next from privlange into @username, @idscreen, @prev
while @@FETCH_STATUS = 0
begin
update tblScreenPriv
set Prev = @prev
where Username = @username and idScreen = @idscreen
fetch next from privlange into @username, @idscreen, @prev
end
close privlange;
deallocate privlange;
解决方案
您需要声明表值类型,并且应该摆脱游标。例如:
create type tblScreen as table(username nvarchar(50), idScren int, Prev bit)
go
create proc usp_UpatePriv
@screen tblScreen Readonly
as
begin
with q as
(
select o.Prev, n.Prev NewPrev
tblScreenPriv o
join @screen n
on o.UserName = n.UserName
and o.idScreen = n.idScreen
)
--select * from q
update q set Prev = NewPrev;
end
推荐阅读
- java - KIE Workbench 决策表没有给出任何结果
- c# - Spawn Enemy GameObject 仅适用于相机视图,而相机随玩家游戏对象移动
- python - 如何获得 Cython 中的最大整数值?
- aframe - 带有 aframe.js 和 howler.js 的实体上的空间声音
- android - 我的 RecyclerView 适配器没有通过 Volley Request 响应更新?
- ios - 使用 Firebase 实时数据库填充集合视图
- python - excel2img 给出错误“异常:定位范围 rez-2!A1:A3 失败”
- python - Django 多组权限
- c# - 为什么 gRPC 不维护服务方法调用之间的状态?
- bash - 无法使用 sdkman 构建 dockerfile