有表raw_material
(code,Ana_Ca,Ana_1)
-------------------
123,null,null另外一表sample_data
(code,elem,val)我在sample_data建立触发器send_value
CREATE TRIGGER send_value ON sample_data
INSTEAD OF INSERT
AS
BEGIN
exec  P_OTH
END
和存储过程P_OTH
CREATE PROCEDURE P_OTH AS
declare @Ele_type varchar(254)
select @Ele_type=elem from sample_data
declare @str vARchar(254)
SELECT @STR=
CASE 
WHEN  @Ele_type='CaO' THEN 'ANA_Ca'
WHEN  @Ele_type='FeO' THEN 'ANA_1'
END
INSERT INTO raw_material(@str)
select val from sample_data
where raw_analysis.code=sample_data.code
GO----------------
当向表sample_data插入记录(123,CaO,1.2)时出错,说raw_material的对象名无效,可能是P_OTH中
的INSERT INTO raw_material(@str)出错了,我该怎么办?望指教!弄了一晚上了:(

解决方案 »

  1.   

    CREATE PROCEDURE P_OTH AS
    declare @Ele_type varchar(254)
    select @Ele_type=elem from inserted--sample_data这里改掉
    declare @str vARchar(254)
    SELECT @STR=
    CASE 
    WHEN  @Ele_type='CaO' THEN 'ANA_Ca'
    WHEN  @Ele_type='FeO' THEN 'ANA_1'
    END
    --INSERT INTO raw_material(@str)这句改掉
    insert into raw_material(code)
    values @str
    select val from sample_data
    where raw_analysis.code=sample_data.code
    GO
      

  2.   

    噢,错了。第一个是不要改的。不过我想了一下,我觉的你还是不要这个存储过程,直接在触发器里写就行了。
    CREATE TRIGGER send_value ON sample_data
    INSTEAD OF INSERT
    AS
    BEGIN
        declare @Ele_type varchar(254)
        select @Ele_type=elem from inserted
        declare @str vARchar(254)
        SELECT @STR=
            CASE 
        WHEN  @Ele_type='CaO' THEN 'ANA_Ca'
        WHEN  @Ele_type='FeO' THEN 'ANA_1'
            END
         insert into raw_material(code)
         values @str
    ENDselect val from sample_data
    where raw_analysis.code=sample_data.code
    你这两句在存储过程里是做什么用的呀?返回值?你这个返回值是返回到触发器里呀,触发器还有返回值??我还是第一次见到。
    你那个报错是因为insert into用错,insert 语句哪能这样呀。要用我种形式
      

  3.   

    回二楼:
    --INSERT INTO raw_material(@str)这句改掉
    insert into raw_material(code)
    values @str
    我不需要插入raw_material(code)字段,是要根据sample_data(elem)的值,来判断将sample_data(val)插入到raw_material(特定字段CASE判断)
    所以才用--INSERT INTO raw_material(@str)
      

  4.   

    回三楼
    select val from sample_data
    where raw_analysis.code=sample_data.code
    你这两句在存储过程里是做什么用的呀?返回值?你这个返回值是返回到触发器里呀,触发器还有返回值??我还是第一次见到。我是想通过这两句返回val值,写到raw_material(@str)字段
      

  5.   

    INSERT INTO raw_material(@str)
    select val from sample_data
    where raw_analysis.code=sample_data.code
    ==========
    Try:
    Exec ( 'INSERT INTO raw_material( ' + @str + ') select val from sample_data
    where raw_analysis.code=sample_data.code')
      

  6.   

    回fightback()
     我测试了你这两个表和触发器及存储过程
    当插入后,执行存储过程时,sample_data表其实根本没有数据,所以select @Ele_type=elem from sample_data这个语句返回值是null
    你说后面的语句能不能执行呢,我试着把存储过程放到触发器里看看能不能行
      

  7.   

    但你触发器里调用存储过程时,这时候表里根本就没有数据,你如何取?
    要么你在触发器里就带个参数进去,把插进去的elem值做为参数赋给存储过程
      

  8.   

    zjdyzwx(十一月猪) 
    你这语句也没用的,我测试了。
    这时候表里根本没有数据,没法取的。在存储过程里怎么改语句都没办法用的。这时候表里根本没有插进去的那个值
      

  9.   

    CREATE TRIGGER send_value ON sample_data
    INSTEAD OF INSERT这个触发器类型决定了,插入sample_data一条记录,这条记录回转存到别的地方,而sample_data不会保留数据==========
    Try:
    Exec ( 'INSERT INTO raw_material( ' + @str + ') select val from sample_data
    where raw_analysis.code=sample_data.code')
    我上午TRY。
    这问题晚上都没睡好,这么早起来看回贴,感谢两位关心
      

  10.   

    zjdyzwx(十一月猪) ( ) 
    Try:
    Exec ( 'INSERT INTO raw_material( ' + @str + ') select val from sample_data
    where raw_analysis.code=sample_data.code')
    郁闷了,同样的错误CRY
      

  11.   

    Impossible to get the inserted data at the trigger as you've writtenotherwise you add the contents of the procedure into the trigger
      

  12.   

    By what you've thought, the procedure should get the data from the logical table [inserted],but otherwise in a trigger, [inserted]([deleted]) table couldn't be met
      

  13.   

    谢谢楼上指教,虽然没看很懂但是
    INSERT INTO 表名( 列名) 值
    中,列名是否能用变量(@str)替代???
      

  14.   

    不行除非使用exec ('INSERT INTO 表名( '+列名+')')的形式
      

  15.   

    下午还是用最老土的方法
    IF ELSE的嵌套判断来解决插入到哪一字段的问题了
    通过设置标志为来解决INSTEAD OF INSERT问题exec ('INSERT INTO 表名( '+列名+')')的方式,在前几楼有提到,不过没用:)
    变态的字符串连接嵌套多表连接查询也许能解决这问题,不过才初学的我看不懂。
    反正实际问题解决了,虽然效率不一定高,结贴