SQL Server:如何在insert语句中执行语句

时间:2014-09-09 04:31:10

标签: sql sql-server

这是我的代码:

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语句也工作正常。只是两者结合时的问题。

感谢。

4 个答案:

答案 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