我正在使用動態SQL寫入存儲過程。使用動態查詢存儲過程
在我的程序中,我說了10個類似列的表。
例如,如果我考慮Designation
& Department
表,Designation
表有這些列:
Designation, Code, EntryBy, EntryOn, ModifiedBy, ModifiedOn
和Department
表有這些列:
Department, Code, EntryBy, EntryOn, ModifiedBy, ModifiedOn
,同樣我有一些其他八桌。
在我的存儲過程中,我需要更新並將數據插入到所有表中。因此,我沒有爲每個表編寫更新&插入語句,而是使用一個接受表名作爲參數的存儲過程,並檢查該表是否已存在於該表中。
如果該行存在,那麼該記錄將被更新,否則該記錄將被插入到相應的表中。
ALTER PROC UpdateMasterItems
(
@MasterTypeTmp varchar(50),
@NameTmp varchar(50),
@CodeTmp varchar(10))
AS
BEGIN
DECLARE @CntTmp numeric(2,0)
EXEC('select count(*)' + @CntTmp + ' from ' + @MasterTypeTmp + ' where ' + @MasterTypeTmp + ' = ' + @NameTmp)
IF(@CntTmp > 1)
BEGIN
EXEC('UPDATE ' + @MasterTypeTmp + ' SET ' + 'Code = ' + @CodeTmp + ', ModifiedBy = CURRENT_USER, MOdifiedOn = CURRENT_TIMESTAMP WHERE' + @MasterTypeTmp + ' = ' + @NameTmp)
RETURN 10
END
ELSE
BEGIN
EXEC('INSERT INTO ' + @MasterTypeTmp + '(' + @MasterTypeTmp + ', Code, EntryBy, EntryOn, ModifiedBy, ModifiedOn) VALUES (' + @NameTmp + ',' + @CodeTmp + ',' + 'CURRENT_USER, CURRENT_TIMESTAMP, CURRENT_USER, CURRENT_TIMESTAMP)')
RETURN 11
END
END
其中@MasterTypeTmp
是表名(可以是Department
/Designation
.....)
在執行過程我得到一個錯誤:
Exec的聲明:
EXEC UpdateMasterItems 'Designation', 'TestName', 'TestCode'
錯誤陳述:
Invalid column name 'TestName'.
Invalid column name 'TestCode'.
但TestName
& TestCode
不列名。這些是列的值。請讓我知道,如果我的動態查詢是錯誤的或問題在哪裏!
在此先感謝
芒卡
感謝您的SQL。所有點都注意到了。我試圖使用IF EXISTS()而不是count。但是,IF EXISTS不會採取動態查詢。它給我錯誤。 – user2174615 2013-03-15 20:32:12
謝謝。所有觀點都指出。是否可以在IF EXISTS()中使用動態sql?當我嘗試這樣做時,我遇到了錯誤。 – user2174615 2013-03-15 20:34:49
是的,你可以。 [檢查這個例子小提琴](http://sqlfiddle.com/#!3/ac7f7/7) – Kaf 2013-03-15 20:41:07