问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

SQL2000 存储过程出错 提示 必须声明变量 '@tb'。

发布网友 发布时间:2024-05-06 22:34

我来回答

3个回答

热心网友 时间:2024-06-05 01:53

楼主的语法是按orcale来的吧?sql server2000中的trigger中没有before、for each row、new等关键字。下面我写了个,能实现你的功能,只是不知道有没有性能更好的写法。期待更佳的....

if exists(select * from sysobjects where name='Insert_Or_Update_sal')
drop trigger Insert_Or_Update_sal
go
CREATE TRIGGER Insert_Or_Update_sal
ON TEACHER
FOR insert,update
AS
BEGIN
declare @job char(8),@sal numeric(7,2),@eno numeric(4)
--inserted是insert或update触发表临时表,参考下面帮助。
select @eno=eno,@job=job,@sal=sal from inserted
if @job='教授' and @sal<4000
update teacher set sal=4000 where eno=@eno

--下面的两句也可能完成这个功能,只是性能低一些。
-- if exists(select * from inserted where job='教授' and sal< 4000)
-- update TEACHER set sal=4000 where job='教授' AND sal<4000
END

下面是sql server2000帮助文档中相关trigger的部分,希望对你有帮助。
----------------------------------------------------------------
CREATE TRIGGER
创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。Microsoft® SQL Server™ 允许为任何给定的 INSERT、UPDATE 或 DELETE 语句创建多个触发器。

语法
CREATE TRIGGER trigger_name
ON
[ WITH ENCRYPTION ]
{

[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) updated_bitmask )
column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}

参数
trigger_name

是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。

Table | view

是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。

WITH ENCRYPTION

加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布。

AFTER

指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

如果仅指定 FOR 关键字,则 AFTER 是默认设置。

不能在视图上定义 AFTER 触发器。

INSTEAD OF

指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。

在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。

INSTEAD OF 触发器不能在 WITH CHECK OPTION 的可更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。

是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。

对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。

WITH APPEND

指定应该添加现有类型的其它触发器。只有当兼容级别是 65 或更低时,才需要使用该可选子句。如果兼容级别是 70 或更高,则不必使用 WITH APPEND 子句添加现有类型的其它触发器(这是兼容级别设置为 70 或更高的 CREATE TRIGGER 的默认行为)。有关更多信息,请参见 sp_dbcmptlevel。

WITH APPEND 不能与 INSTEAD OF 触发器一起使用,或者,如果显式声明 AFTER 触发器,也不能使用该子句。只有当出于向后兼容而指定 FOR 时(没有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以后的版本将不支持 WITH APPEND 和 FOR(将被解释为 AFTER)。

NOT FOR REPLICATION

表示当复制进程更改触发器所涉及的表时,不应执行该触发器。

AS

是触发器要执行的操作。

sql_statement

是触发器的条件和操作。触发器条件指定其它准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。

当尝试 DELETE、INSERT 或 UPDATE 操作时,Transact-SQL语句中指定的触发器操作将生效。

触发器可以包含任意数量和种类的 Transact-SQL 语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的 Transact-SQL 语句常常包含控制流语言。CREATE TRIGGER 语句中使用几个特殊的表:

deleted 和 inserted 是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索 deleted 表中的所有值,请使用:
SELECT *
FROM deleted

如果兼容级别等于 70,那么在 DELETE、INSERT 或 UPDATE 触发器中,SQL Server 将不允许引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能访问 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 触发器中检索新值,请将 inserted 表与原始更新表联接。当兼容级别是 65 或更低时,对 inserted 或 deleted 表中允许空值的text、ntext 或 image 列,将返回空值;如果这些列不可为空,则返回零长度字符串。
当兼容级别是 80 或更高时,SQL Server 允许在表或视图上通过 INSTEAD OF 触发器更新 text、ntext 或 image 列。

n

是表示触发器中可以包含多条 Transact-SQL 语句的占位符。对于 IF UPDATE (column) 语句,可以通过重复 UPDATE (column) 子句包含多列。

IF UPDATE (column)

测试在指定的列上进行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作。可以指定多列。因为在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要测试在多个列上进行的 INSERT 或 UPDATE 操作,请在第一个操作后指定单独的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 将返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。

说明 IF UPDATE (column) 子句的功能等同于 IF、IF...ELSE 或 WHILE 语句,并且可以使用 BEGIN...END 语句块。有关更多信息,请参见控制流语言。

可以在触发器主体中的任意位置使用 UPDATE (column)。

column

是要测试 INSERT 或 UPDATE 操作的列名。该列可以是 SQL Server 支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。

IF (COLUMNS_UPDATED())

测试是否插入或更新了提及的列,仅用于 INSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。

COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。

可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。

bitwise_operator

是用于比较运算的位运算符。

updated_bitmask

是整型位掩码,表示实际更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 触发器,若要检查列 C2、C3 和 C4 是否都有更新,指定值 14;若要检查是否只有列 C2 有更新,指定值 2。

comparison_operator

是比较运算符。使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新。使用大于号 (>) 检查 updated_bitmask 中指定的任一列或某些列是否已更新。

column_bitmask

是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。

注释
触发器常常用于强制业务规则和数据完整性。SQL Server 通过表创建语句(ALTER TABLE 和 CREATE TABLE)提供声明引用完整性 (DRI);但是 DRI 不提供数据库间的引用完整性。若要强制引用完整性(有关表的主键和外键之间关系的规则),请使用主键和外键约束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 关键字)。如果触发器表存在约束,则在 INSTEAD OF 触发器执行之后和 AFTER 触发器执行之前检查这些约束。如果违反了约束,则回滚 INSTEAD OF 触发器操作且不执行(激发)AFTER 触发器。

可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER 触发器。在表上只能为每个 INSERT、UPDATE 和 DELETE 操作指定一个第一个执行和一个最后一个执行的 AFTER 触发器。如果同一表上还有其它 AFTER 触发器,则这些触发器将以随机顺序执行。

如果 ALTER TRIGGER 语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用 sp_settriggerorder 重置排序值。

只有当触发 SQL 语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AFTER 触发器才会执行。AFTER 触发器检查触发语句的运行效果,以及所有由触发语句引起的 UPDATE 和 DELETE 引用级联操作的效果。

触发器限制
CREATE TRIGGER 必须是批处理中的第一条语句,并且只能应用到一个表中。

触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。

如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。

在同一条 CREATE TRIGGER 语句中,可以为多种用户操作(如 INSERT 和 UPDATE)定义相同的触发器操作。

如果一个表的外键在 DELETE/UPDATE 操作上定义了级联,则不能在该表上定义 INSTEAD OF DELETE/UPDATE 触发器。

在触发器内可以指定任意的 SET 语句。所选择的 SET 选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。

与使用存储过程一样,当触发器激发时,将向调用应用程序返回结果。若要避免由于触发器激发而向应用程序返回结果,请不要包含返回结果的 SELECT 语句,也不要包含在触发器中进行变量赋值的语句。包含向用户返回结果的 SELECT 语句或进行变量赋值的语句的触发器需要特殊处理;这些返回的结果必须写入允许修改触发器表的每个应用程序中。如果必须在触发器中进行变量赋值,则应该在触发器的开头使用 SET NOCOUNT 语句以避免返回任何结果集。

DELETE 触发器不能捕获 TRUNCATE TABLE 语句。尽管 TRUNCATE TABLE 语句实际上是没有 WHERE 子句的 DELETE(它删除所有行),但它是无日志记录的,因而不能执行触发器。因为 TRUNCATE TABLE 语句的权限默认授予表所有者且不可转让,所以只有表所有者才需要考虑无意中用 TRUNCATE TABLE 语句规避 DELETE 触发器的问题。

无论有日志记录还是无日志记录,WRITETEXT 语句都不激活触发器。

热心网友 时间:2024-06-05 01:59

insert @tb (partno,brand,datecode,quantity,price,package,note,[sign],userid,grade) values(@partno,@brand,@datecode,@quantity,@price,@package,@note,@sign,@userid,@grade)

从这句代码来看,@tb 是一个表变量
declare @infoid int,@sign varchar(20),@tb varchar(20)

但是你在前面声明的明明是一个varchar类型

所以你可以把这两个变量之中的一个改一下,然后用一下语句声明表变量
declare table @tb (partno varchar(10),brand.。。。。。) 列名和数据类型自己写

热心网友 时间:2024-06-05 01:59

SqlServer中的变量在使用前必须先声明。
所以
1、在“set @tb = 'stock' + cast(@grade as varchar”之前必须先有DECLARE @tb VARCHAR(这里是字符串长度),如果是这样,那么@tb 是个标量变量
2、根据“select @infoid = id from @tb where partno = @partno and [sign] = @sign”可以看出@tb 是个表变量。
所以这个存储过程没法改。因为实在无法声明@tb这个变量
SQL2000 存储过程出错 提示 必须声明变量 '@tb'。

1、在“set @tb = 'stock' + cast(@grade as varchar”之前必须先有DECLARE @tb VARCHAR(这里是字符串长度),如果是这样,那么@tb 是个标量变量2、根据“select @infoid = id from @tb where partno = @partno and [sign] = @sign”可以看出@tb 是个表变量。所以这个存储过程没法改。因为实在无法声明...

一个sqlserver存储过程,创建时没报错,执行时有错误

set @sql_text = 'select distinct ' + @fieldname + ' from ' + @tb --这两个参数传参的内容都是数据库中有定义的东西(一个是字段,一个是表名),而不是普通的参数,所以这两个参数要放在引号外面,而普通的参数直接放在引号里面即可 exec(@sql_text) --执行此语句 commit transac...

sql 存储过程中 如何使用declare 有的存储过程声明了,有的没有声明...

1、打开SQL Database Studio。2、点击展开数据库连接和数据库。3、右击要修改的存储过程,然后点击【alter procedure】。4、此时进入存储过程编辑界面。5、修改存储过程语句。6、点击左侧的【execute】。7、此时显示执行结果,成功表示存储过程的定义修改完成了。

sql server这个存储过程哪里错了?我看不懂提示。很简单的

加了个加号在@tbname前面

sql存储过程语句select * into

不允许在关键字部分使用变量。如果你确实要这样,用动态语句

sql server如何用存储过程把多个表的数据添加到一张表中,表字段都很...

然后字段是哪些 如果表名不变 字段类似的话 我帮你写个模型 create proc usp_tableall as insert into 表名 --这里表要存在 存储你处理的数据 否则就用select * into from tb 的格式 select col1,col2 from a union all select col1,col2 from b ……go exec usp_tableall ...

mysql存储过程中declare 和set 定义变量的区别

set是对变量赋值,可以放在过程的任何地方 对没有declare声明过的变量赋值,该变量必须以加上@号,否则会报错 DECLARE a INT; -- 如果放在下面语句之后,会报错 SET a = (SELECT id FROM tb); -- 如果没有前面的声明,会报错 SET @b = (SELECT title FROM tb);

怎样SQL存储过程中执行动态SQL语句

SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) + 'WHERE OrderID = @OrderID ORDER BY ORDERID DESC'EXEC(@sql);关键就在SET @sql这一句话中,如果我们运行这个批处理,编译器就会产生一下错误 Msg 137, Level 15, State 2, Line 1 必须声明标量变量 "@OrderID"。使用EXEC时,如果...

sql server 存储过程 表变量名无法用在查询字符串中

用存储过程sp_executesql倒是可以传递其他标量类型的参数,但是也无法传递表变量)。而你要实现的功能是在执行动态SQL之前,已经把数据查询到一个表变量中了,然后要在动态SQL中再查询此表变量,目前来说是不能实现的。可以使用临时表,或者游标,这两个可以在动态SQL中保持有效状态。使用游标的示例如下:d...

SQL 取存储过程的返回值

你这个存储过程,这样直接返回字符串,是不行的。存储过程直接返回,只能返回int类型的数据,或者是int类型的字符串。你需要为你的存储过程定义一个输出参数。然后在调用时,接收这个输出参数。

存储过程必须声明标量变量 存储过程变量声明 mysql存储过程声明变量 gp存储过程声明变量 声明变量执行oracle存储过程 oracle存储过程动态声明变量 oracle存储过程输出变量 存储过程变量赋值和使用 存储过程定义变量
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...号我给对方付款后扣的我哪里的钱,钱是什么时候扣 求DRAMA续ふしぎ工房症候群 EPISODE.06 和 DEARS星座物语外伝~二十四の... 针灸有多疼 word怎么显示修改后的内容 word怎么显示修订内容 显示修订内容方法介绍 本田雅阁多少钱一辆 本田雅阁空调滤芯怎么换 宜昌到巫山的路线 ...老。病。死。求不得,爱别离,怨憎会,五阴炽盛。怜众生无知..._百度... 佛经里说人间八苦:生老病死,爱别离,怨憎悔,求不得,放不下。 思域d3档是什么模式 本田思域的d3d2是什么档位 150斤穿多大码衣服宽松 老公生日应该怎样给他过呢? 金华中心医院预约挂号 努力上进被埋没是什么意思 初中英语小题狂做单项填空七年级上的答案 请问嘉兴市公积金贷款额度是多少 中小学教育过程最基本的功能是( ) 环境描写的例子 家里的分空开坏了一个会引想总空开吗? ...从未使用过,想问问没开封的灭火器,放在家中,对人身体有没有影响... 桥梁建筑源于哪个国家? 桥梁后张法预应力是哪个国家的技术,是中国的技术吗? 水培蒜苗烂根怎么办 烂根的补救办法有哪些 穿越火线怎么当终结者 爱宁达能治好激素依赖皮炎吗 20国债04是什么意思 黑曜石貔貅手链被朋友摸到怎么办? 第一次网上订机票,选了座位他要我去什么南航网上值机,不去会怎样?_百 ... cored是什么意思英语? 去亲戚家做客日记 海南临高县南宝镇中心小学校长是谁 原神白术阵容怎么搭配-白术最强阵容搭配攻略 感冒能吃橙子吗 本人要开办一家影视公司,由七人合股。取个什么样的名字为好? 请大家... 经开区注册公司:注册合伙公司公司营业执照写谁的名字 汤臣倍健的维生素c是天然维生素吗 工资争议属于劳动争议吗 拖欠工资是否属于劳动争议 请问玛田音箱效果好吗? 仲裁期间的工资怎么算 用vc6.0编程鸡兔同笼,共有30个头,88只脚.编程求笼中鸡兔各有多少只 胶原蛋白功用?迅速有效保养胶原蛋白如何做? 支付宝花呗额度会提升吗 怎样删除淘宝评价? 乾隆轧道粉彩瓷:瓷器艺术的“奇葩” 天民楼藏瓷100%成交率专场 全场高清图赏 附成交价记录 从远地点到近地点地球引力做工 幽情雅趣造句 幽情雅趣の例文 "幽情雅趣"是什麼意思 为什么长大后和小时候差别那么大? 为什么人长大了就跟小时候差别很大了?