我正在使用动态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