2012-12-05 46 views
0

我在MS SQL中創建觸發器時遇到了一個奇怪的問題。 我有一個查詢執行沒有錯誤,但當我把它放在觸發器體內,它會給出錯誤查詢在沒有錯誤但沒有觸發的情況下執行

無效的列名'ScreenName'。

我在這裏放置整個觸發代碼。

CREATE TRIGGER [dbo].[tr_tbFieldLabels_FieldLabelLength] ON [dbo].[tbFieldLabels] 
AFTER INSERT 
AS 
    Update tbFieldLabels 
    Set TextBoxLength = (SELECT top 1 TextboxLength 
           FROM tbFieldLabelsSource FLS 
           WHERE FLS.ScreenName = Inserted.ScreenName 
           AND FLS.SystemName = Inserted.SystemName) 
    FROM tbFieldLabels , Inserted WHERE tbFieldLabels.ID = Inserted.ID 
GO 

回答

1

您的錯誤與顯示的觸發代碼無關。

鑑於這種結構:

create table tbFieldLabels (id int, screenname varchar(10), systemname varchar(10), textboxlength int); 
create table tbFieldLabelsSource (screenname varchar(10), systemname varchar(10), textboxlength int); 
insert tbFieldLabelsSource select 'abc', 'def', 99; 
insert tbFieldLabelsSource select 'zyx', 'def', 67; 
GO 

以下觸發器可以成功創建:

CREATE TRIGGER [dbo].[tr_tbFieldLabels_FieldLabelLength] ON [dbo].[tbFieldLabels] 
AFTER INSERT 
AS 
    Update tbFieldLabels 
    Set TextBoxLength = (SELECT top 1 TextboxLength 
           FROM tbFieldLabelsSource FLS 
           WHERE FLS.ScreenName = Inserted.ScreenName 
           AND FLS.SystemName = Inserted.SystemName) 
    FROM tbFieldLabels , Inserted WHERE tbFieldLabels.ID = Inserted.ID 
GO 

你在問題中的代碼會失敗,

多部分組成的標識符「tbFieldLabelsSource.SystemName」無法綁定。

因爲你的別名tbFieldLabelsSourceFLS,而是通過全名仍然引用它。

使用上面顯示的觸發,我可以運行這個命令:

insert tbFieldLabels select 4, 'zyx', 'def', null; 

這是成功的,並插入此記錄:

id   screenname systemname textboxlength 
----------- ---------- ---------- ------------- 
4   zyx  def  67 
+0

感謝您的答覆。 我不面臨你提到的這個問題。我可能修改了它忘記使用別名。在這種情況下,你會提到同樣的錯誤。但我面臨着另一個問題。數據庫拒絕存在where子句中的列。 – Lali

+0

'AS'和'Go'中的查詢運行良好,但是當我運行整個觸發器時。我導致錯誤'無效的列名'ScreenName'' – Lali

+1

如果你沒有顯示你的確切代碼,沒有人可以幫助你。至於「AS和GO之間的查詢運行良好」 - 這是不可能的,因爲INSERTED虛擬表不存在於觸發器之外。用更多的事實來編輯你的問題。 – RichardTheKiwi

相關問題