触发器问题

spidertan 2004-01-07 11:21:48
我在表slips上写了一个这样的触发器,可我update触发触发器时出现如下错误:ODBC error 208 (42S02) 对象名 'slips_memo' 无效。下面是我的触发器源代码,大家帮我看看是什么原因出现这个错误,谢谢!
CREATE TRIGGER send_slip_messages ON slips
FOR update
AS
declare @mail varchar(255)
declare @sub varchar(255)
declare @mes varchar(255)
declare @mes1 varchar(255)
declare @id int
declare @o_devid integer
declare @n_devid integer
declare @o_qaid integer
declare @n_qaid integer
declare @n_devname varchar(15)
declare @o_devname varchar(15)
declare @qaname varchar(15)
declare @o_qaname varchar(15)
declare @name varchar(15)
declare @title varchar(255)
declare @type varchar(255)
declare @prio varchar(15)
declare @problem varchar(255)
declare @source integer
declare @prod_name varchar(50)
declare @mod_name varchar(80)
declare @modid smallint
select @id=slip_id,@n_devid=accepter_id,@source=sour_id,@n_qaid=closer_id,@modid=mod_id from inserted
select @o_devid=accepter_id,@o_qaid=closer_id from deleted
if update(closer_id) and @source<>3 and @o_qaid<>@n_qaid
begin
select @mail=qa_mail,@qaname=qa_name from qa where qa_id=@n_qaid
select @o_qaname=qa_name from qa where qa_id=@o_qaid
select @name=log_name from work_login where qa_id=@n_qaid
select @title=title FROM slips where slip_id=@id
SELECT @type=slip_type.pro_name FROM slips INNER JOIN slip_type ON slips.type_id=slip_type.id where slips.slip_id=@id
SELECT @qaname=qa.qa_name FROM qa INNER JOIN slips ON qa.qa_id=slips.opener_id where slips.slip_id=@id
SELECT @prio=slip_priority.pri_name FROM slip_priority INNER JOIN slips ON slip_priority.pri_id=slips.priority where slips.slip_id=@id
select @prod_name=product.product_name,@mod_name=module.module_name from product inner join module on product.product_id=module.product_id where module.module_id=@modid
select @sub='Bug由Master转给您确认!'
select @mes1='More Information:http://bug'
select @mes='This mail is to QA '+@qaname+' from qa '+@o_qaname+char(13)+char(13)+'BugID:'+convert(varchar(9),@id)+char(13)+'Product:'+@prod_name+char(13)+'Module:'+@mod_name+char(13)+'Title:'+@title+char(13)+'类型:'+@type+char(13)+'优先级:'+@prio+char(13)+@mes1
select @problem='SELECT 问题描述=convert(varchar(30),trace),slip_memo FROM slips_memo where slip_id='+convert(varchar(9),@id)
exec master..xp_sendmail @recipients=@mail,@subject=@sub,@query=@problem,@message=@mes,@width=180
end
if @n_devid<>@o_devid and @source<>3
begin
select @mail=qa_mail,@n_devname=qa_name from qa where qa_id=@n_devid
select @o_devname=qa_name from qa where qa_id=@o_devid
select @name=log_name from work_login where qa_id=@n_devid
select @title=title FROM slips where slips.slip_id=@id
SELECT @type=slip_type.pro_name FROM slips INNER JOIN slip_type ON slips.type_id=slip_type.id where slips.slip_id=@id
SELECT @qaname=qa.qa_name FROM qa INNER JOIN slips ON qa.qa_id=slips.closer_id where slips.slip_id=@id
SELECT @prio=slip_priority.pri_name FROM slip_priority INNER JOIN slips ON slip_priority.pri_id=slips.priority where slips.slip_id=@id
select @sub='有Bug转给您解决!'
select @mes1='More Information:http://bug'
select @mes='This mail is to DEV '+@n_devname+' from DEV '+@o_devname+char(13)+char(13)+'BugID:'+convert(varchar(9),@id)+char(13)+'Product:'+@prod_name+char(13)+'Module:'+@mod_name+char(13)+'Title:'+@title+char(13)+'类型:'+@type+char(13)+'优先级:'+@prio+char(13)+@mes1
select @problem='SELECT 问题描述=convert(varchar(30),trace),slip_memo FROM slips_memo where slip_id='+convert(varchar(9),@id)
exec master..xp_sendmail @recipients=@mail,@subject=@sub,@query=@problem,@message=@mes,@width=180
end
...全文
33 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
spidertan 2004-01-07
  • 打赏
  • 举报
回复
sdhdy(大江东去...) 也不是这个原因,如果加夫所有者.slips_memo,就报所有者.slips_memo对象无效!
sdhdy 2004-01-07
  • 打赏
  • 举报
回复
你的slips_memo所有者是dbo吗?如果不是的话,
改为所有者.slips_memo
spidertan 2004-01-07
  • 打赏
  • 举报
回复
数据库为2000
spidertan 2004-01-07
  • 打赏
  • 举报
回复
zjcxc(邹建),有这个表,如果没有这个表,那问题就变得简单,我也不用上这里来问了,谢谢
zjcxc 元老 2004-01-07
  • 打赏
  • 举报
回复
--检查一下,查询分析器中执行下面的语句,看测试是否通过:

use 你的数据库名
go

if exists(select 1 from sysobjects where object_id('slips_memo')=id and xtype='U')
print '测试通过'
else
print '数据库中缺少需要的表'
zjcxc 元老 2004-01-07
  • 打赏
  • 举报
回复
你的数据库中没有这个表吧?
slips_memo
spidertan 2004-01-07
  • 打赏
  • 举报
回复
好像跟我的问题风马牛不相关啊
dlkfth 2004-01-07
  • 打赏
  • 举报
回复

Transact-SQL 参考


排序规则的优先顺序
排序规则的优先顺序(也称为排序规则类型强制规则)是赋予一组规则的术语,而这组规则决定:

取值为字符串的表达式的最终结果的排序规则。


区分排序规则的运算符所使用的排序规则,这些运算符使用字符串输入但不返回字符串,如 LIKE 和 IN。
排序规则的优先顺序规则只适用于字符串数据类型:char、varchar、text、nchar、nvarchar 和 ntext。具有其它数据类型的对象不参加排序规则的评估。

所有对象的排序规则可归为四类中的一种。每类的名称叫做排序规则标志。

排序规则标志 对象类型
强制默认 任何 Transact-SQL 字符串变量、参数、字面值、目录内置函数的输出、或不使用字符串输入但产生字符串输出的内置函数。
如果在用户定义函数、存储过程或触发器中声明某个对象,则将该对象指派为在其中创建函数、存储过程或触发器的数据库的默认排序规则。如果在批处理中声明该对象,则将其指派为连接所使用的当前数据库的默认排序规则。

隐性 X 列引用。从为表或视图中的列定义的排序规则得到表达式(由 X 表示)的排序规则。
即使 CREATE TABLE 或 CREATE VIEW 语句中的 COLLATE 子句给列显式指派了排序规则,该列引用仍归为隐性。

显式 X 使用表达式中的 COLLATE 子句显式投影到特定排序规则(由 X 表示)的表达式。
无排序规则 表示表达式的值是两个字符串之间操作的结果,而这两个字符串具有隐性排序规则标志的冲突排序规则。表达式的结果被定义为不具有排序规则。


只引用一个字符串对象的简单表达式的排序规则标志是被引用对象的排序规则标志。

如果复杂表达式所引用的两个操作数表达式的排序规则标志相同,则该复杂表达式的排序规则标志为数表达式的排序规则标志。

如果复杂表达式所引用的两个操作数表达式的排序规则不同,则该复杂表达式最终结果的排序规则标志基于下列规则:

显式优先于隐性。隐性优先于强制默认。换言之,
显式 > 隐性 > 强制默认

组合两个已指派给不同排序规则的显式表达式将生成错误。
显式 X + 显式 Y = 错误

组合两个具有不同排序规则的隐性表达式将产生无排序规则。
隐性 X + 隐性 Y = 无排序规则

将无排序规则的表达式与任何标志的表达式组合,除了显式排序规则外(参见下一项),都产生无排序规则标志的结果。
无排序规则 + 任何标志 = 无排序规则

将无排序规则的表达式与显式排序规则的表达式组合将产生具有显式标志的表达式。
无排序规则 + 显式 X = 显式

下面的示例说明上述规则。

USE tempdb
GO

CREATE TABLE TestTab (
id int,
GreekCol nvarchar(10) collate greek_ci_as,
LatinCol nvarchar(10) collate latin1_general_cs_as
)
INSERT TestTab VALUES (1, N'A', N'a')
GO

下面查询中的谓词具有排序规则冲突,因此产生错误:

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol

下面是结果集。

Msg 446, Level 16, State 9, Server CTSSERV, Line 1
Cannot resolve collation conflict for equal to operation.

下面查询中的谓词在排序规则 greek_ci_as 中取值,因为右边表达式具有显式标志,优先于右边表达式的隐性标志:

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as

下面是结果集。

id GreekCol LatinCol
----------- -------------------- --------------------
1 a A

(1 row affected)

下面查询中的 case 表达式没有排序规则标志,所以不能出现在选择列表中,也不能由区分排序规则的运算符操作。不过,这些表达式可由不区分排序规则的运算符操作。

SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)
FROM TestTab

下面是结果集。

Msg 451, Level 16, State 1, Line 1
Cannot resolve collation conflict for column 1 in SELECT statement.

SELECT PATINDEX((CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END), 'a')
FROM TestTab

下面是结果集。

Msg 446, Level 16, State 9, Server LEIH2, Line 1
Cannot resolve collation conflict for patindex operation.

SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END) COLLATE Latin1_General_CI_AS
FROM TestTab

下面是结果集。

--------------------
a

(1 row affected)

下表汇总了上述规则。

操作数强制标志
显式 X
隐性 X 强制默认
无排序规则
显式 Y 生成错误 结果为显式 Y 结果为显式 Y 结果为显式 Y
隐性 Y 结果为显式 X 结果为无排序规则 结果为隐性 Y 结果为无排序规则
强制默认 结果为显式 X 结果为隐性 X 结果为强制默认 结果为无排序规则
无排序规则 结果为显式 X 结果为无排序规则 结果为无排序规则 结果为无排序规则


运算符和函数区分排序规则或不区分排序规则:

区分排序规则表示指定无排序规则操作数是编译时错误。表达式结果不能是无排序规则。


不区分排序规则表示操作数和结果可以是无排序规则。
比较运算符以及 MAX、MIN、BETWEEN、LIKE 和 IN 运算符都区分排序规则。运算符所使用的字符串被赋以具有较高优先顺序的操作数的排序规则标志。UNION 运算符也区分排序规则,且所有的字符串操作数和最终结果被赋以具有最高优先顺序的操作数的排序规则。按列评估 UNION 操作数和结果的排序规则优先顺序。

赋值运算符不区分排序规则,右边的表达式投影到左边的排序规则上。

字符串串联运算符不区分排序规则,两个字符串操作数和结果被赋以具有最高排序规则优先顺序的操作数的排序规则标志。UNION ALL 和 CASE 运算符不区分排序规则,所有的字符串操作数和最终结果都被赋以具有最高优先顺序的操作数的排序规则标志。按列评估 UNION ALL 操作数和结果的排序规则优先顺序。

CAST、CONVERT 和 COLLATE 函数区分 char、varchar 和 text 数据类型的排序规则。如果 CAST 和 CONVERT 函数的输入和输出是字符串,则输出字符串具有输入字符串的排序规则标志。如果输入不是字符串,则输出字符串为强制默认并被赋以连接所使用的当前数据库的排序规则,或是包含引用 CAST 或 CONVERT 的用户定义函数、存储过程或触发器的数据库的排序规则。

对于返回字符串但不使用字符串输入的内置函数,结果字符串为强制默认并被赋以当前数据库的排序规则,或是包含引用该函数的用户定义函数、存储过程或触发器的数据库的排序规则。

下列函数区分排序规则,其输出字符串具有输入字符串的排序规则标志:

CHARINDEX


DIFFERENCE


ISNUMERIC


LEFT


LEN


LOWER


PATINDEX


REPLACE


REVERSE


RIGHT


SOUNDEX


STUFF


SUBSTRING


UPPER
下列附加规则也适用于排序规则优先顺序:

在已经是显式表达式的表达式上不能有多个 COLLATE 子句。例如,下面的 WHERE 子句是不合法的,因为将 COLLATE 子句指定给的表达式已经是显式表达式:
WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_AS

text 数据类型不允许代码页转换。如果排序规则的代码页不同,不能将文本表达式从一种排序规则投影到另一种排序规则。如果右边文本操作数的排序规则代码页与左边文本操作数不同,则赋值运算符不能赋值。
在数据类型转换后确定排序规则的优先顺序。产生结果排序规则的操作数可以与提供最终结果数据类型的操作数不同。例如,考察下面的批处理:

CREATE TABLE TestTab
(PrimaryKey int PRIMARY KEY,
CharCol char(10) COLLATE French_CI_AS
)

SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc'

简单表达式 N'abc' 的 Unicode 数据类型具有较高的数据类型优先顺序,所以结果表达式将 Unicode 数据类型指派给 N'abc'。然而,表达式 CharCol 具有隐性排序规则标志,而 N'abc' 具有较低的强制默认排序规则标志,所以使用的排序规则是 CharCol 的 French_CI_AS 排序规则。


请参见

COLLATE

数据类型转换

©1988-2000 Microsoft Corporation。保留所有权利。
spidertan 2004-01-07
  • 打赏
  • 举报
回复
解决,散分

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧