这是我的代码:
INSERT INTO HCSERVREC (COMP_CD, JOBTL_CD, emp_no,from_dt,service_type)
values ( '1',( if NOT EXISTS(
SELECT 1
FROM SDOPTTABLE
WHERE OPTTABLENO = '324'
AND OPTTABLEVAL = '00883578'
)
BEGIN
INSERT INTO SDOPTTABLE (
comp_cd
,opttableno
,opttableval
,optname
,dt_stamp
)
VALUES (
'1'
,'324'
,'00883578'
,'STOCKROOM ATTENDANT'
,getdate()
)
END
SELECT *
FROM SDOPTTABLE
WHERE OPTTABLENO = '324'
AND OPTTABLEVAL = '00883578'),'1234567','0','123456')
这些是我收到的错误消息:
Msg 156,Level 15,State 1,Line 2
关键字附近的语法不正确'如果'。Msg 102,Level 15,State 1,Line 28
')'附近的语法不正确。
我想要做的就是在插入数据输入之前进行验证。如何正确执行?
仅供参考,当我用单个数据替换if语句时,sql工作正常,即使我独立运行IF语句也工作正常。只是两者结合时的问题。
感谢。
答案 0 :(得分:2)
先检查然后插入
IF NOT EXISTS(
SELECT 1
FROM SDOPTTABLE
WHERE OPTTABLENO = '324'
AND OPTTABLEVAL = '00883578'
)
BEGIN
INSERT INTO SDOPTTABLE (
comp_cd
,opttableno
,opttableval
,optname
,dt_stamp
)
VALUES (
'1'
,'324'
,'00883578'
,'STOCKROOM ATTENDANT'
,getdate()
)
END
INSERT INTO HCSERVREC (COMP_CD, JOBTL_CD, emp_no,from_dt,service_type)
SELECT '1',
(SELECT * -- select only the required column. You cannot use * here
FROM SDOPTTABLE
WHERE OPTTABLENO = '324'
AND OPTTABLEVAL = '00883578'),
'1234567',
'0',
'123456'
答案 1 :(得分:0)
在您运行INSERT
或跳过它之前,您需要先检查 。您不能在IF
:
INSERT
个语句
IF NOT EXISTS(SELECT * FROM dbo.SDOPTTABLE WHERE OPTTABLENO = '324' AND OPTTABLEVAL = '00883578')
INSERT INTO HCSERVREC (COMP_CD, JOBTL_CD, emp_no,from_dt,service_type)
VALUES ('1', .......)
INSERT
语句可以采用两种形式 - 要么有一个固定的值列表作为文字('1'
)或SQL变量 - 那么你可以使用INSERT INTO Table(columns) VALUES(values)
方法。 / p>
或者您想使用另一个表中的SELECT
语句来插入值,然后您需要使用INSERT INTO Table(columns) SELECT column FROM OtherTable WHERE condition
样式。再说一遍:你可以选择其中一个 - 但是你不能混用它们(例如,在SELECT
枚举的中间你不能有一个子VALUES(., ., ....)
答案 2 :(得分:0)
我建议您使用insert . . . select
INSERT INTO HCSERVREC(COMP_CD, JOBTL_CD, emp_no,from_dt,service_type)
SELECT '1', '324', '00883578', 'STOCKROOM ATTENDANT', getdate()
WHERE NOT EXISTS (SELECT 1
FROM SDOPTTABLE
WHERE OPTTABLENO = '324' AND OPTTABLEVAL = '00883578'
);
答案 3 :(得分:0)
那是不可能的。在插入时,您只需为一列获取一个值。
建议首先检查不存在选择查询然后插入。
是的,您可以使用大小写或子查询来获取单个值来替换上面的语句。
<强>更新强>
如果您希望这种情况,那么您可以为此创建动态查询。
--declare table1 table ( id int, value varchar(10) )
--drop table Table1
begin tran
create table table1 ( id int, value varchar(10), value1 varchar(10), value2 varchar(10))
insert into table1 values( 1,'001','A','A1')
insert into table1 values(2, '002','B','B1')
insert into table1 values( 3,'003','C','C1')
-----insert example
--always use nvarchar for dynamic query, other wise gives error
declare @sql nvarchar(max), @columnlist nvarchar(max) = 'id', @columnlistvalue nvarchar(max) ='4'
declare @checkvalue varchar = '1',@checkvalue2 varchar = '2',@checkvalue3 varchar,
@columnvalueFirst varchar(10) = 'this entry done by dynamic query on condition basis'
if(@checkvalue = 1)
begin
set @columnlist = @columnlist + ',value'
set @columnlistvalue = @columnlistvalue + ',''004''' --or you can add @checkvalue
end
if(@checkvalue2 = 2)
begin
--this is example, you can add another condition. Right now if else condition gives same output
if( len(@columnlist) > 0)
begin
set @columnlist = @columnlist + ',value1'
set @columnlistvalue = @columnlistvalue + ',''D''' --or you can add @checkvalue2
end
else
begin
set @columnlist = @columnlist + ',value'
set @columnlistvalue = @columnlistvalue + ',''D'''
end
end
if(@checkvalue3 = 3)
begin
--this is example, you can add another condition. Right now if else condition gives same output
if( len(@columnlist) > 0)
begin
set @columnlist = @columnlist + ',value2'
set @columnlistvalue = @columnlistvalue + ',''D1''' --or you can add @checkvalue3
end
else
begin
set @columnlist = @columnlist + ',value2'
set @columnlistvalue = @columnlistvalue + ',''D1'''
end
end
select * from table1
set @sql = 'insert into table1 ('+ @columnlist +') values ( ' + @columnlistvalue + ')'
select @sql --you can check that what is wrong by
exec sp_executesql @sql
select * from table1
rollback