Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL合并。退出时更新,如果不存在则插入';t、 在存储过程中使用变量_Sql_Tsql_Merge_Sybase Ase15 - Fatal编程技术网

SQL合并。退出时更新,如果不存在则插入';t、 在存储过程中使用变量

SQL合并。退出时更新,如果不存在则插入';t、 在存储过程中使用变量,sql,tsql,merge,sybase-ase15,Sql,Tsql,Merge,Sybase Ase15,在nor Sybase ASE 15.7之前从未使用过MERGE 我需要一个存储过程来更新现有数据,如果不存在,则插入它。 我知道如何在没有合并的情况下使用它,但我想学习如何使用它 这是我的表格和测试数据: CREATE TABLE myTable( col1 Smallint Not NULL, col2 Char(15) Not NULL, col3 Char(2) Not NULL, col4 BIT Not NU

在nor Sybase ASE 15.7之前从未使用过
MERGE

我需要一个存储过程来更新现有数据,如果不存在,则插入它。 我知道如何在没有合并的情况下使用它,但我想学习如何使用它

这是我的表格和测试数据:

CREATE TABLE myTable(
    col1    Smallint    Not NULL,
    col2    Char(15)    Not NULL,
    col3    Char(2)     Not NULL,
    col4  BIT   Not NULL,
    col5 varchar(100) NULL,
    Constraint PK_myTable primary key clustered (col1,col2,col3)
)
go

insert into myTable values( 1,'A','1',1,'A')
go
我的程序

    create procedure spInsertUpdateMytable(
        @col1   Smallint,
        @col2   Char(15),
        @col3   Char(2),
        @col4   BIT,
        @col5   varchar(100))
    AS

    merge into myTable as V
         using (select col1, col2, col3, col4, col5 from myTable
              where @col1=col1 and @col2 = col2 and @col3=col3) as N
         ON v.col1=n.col1 and v.col2=n.col2 and v.col3=n.col3
         when not matched then
            insert (col1, col2, col3, col4, col5)
             values( @col1, @col2, @col3, @col4, @col5)
         when matched
            then update set
              v.col4 = @col4, v.col5 = @col5
go
更新似乎有效,但insert无效

exec spInsertUpdateMytable  1,'A','1',0,'B' --Update is done ok.

exec spInsertUpdateMytable  1,'C','1',0,'Z' --No new record added
我不知道我做错了什么,我遵循这个规范

刚刚做出了改变@PeterHenell发表了评论,效果令人振奋

    create procedure spInsertUpdateMytable(
        @col1   Smallint,
        @col2   Char(15),
        @col3   Char(2),
        @col4   BIT,
        @col5   varchar(100))
    AS

    merge into myTable as V
         using (select @col1 col1, @col2 col2, @col3 col3, @col4 col4, @col5 col5 ) as N

         when not matched then
            insert (col1, col2, col3, col4, col5)
             values( @col1, @col2, @col3, @col4, @col5)
         when matched
            then update set
              v.col4 = @col4, v.col5 = @col5
go

我认为问题在于
using
中的过滤器,它找不到任何行,因此不会有“不匹配”的行。本质上,
using
-子句需要返回将插入或更新的行。如果行应该是
匹配的
还是
不匹配的
@PeterHenell,则
on
-子句将是决定因素。非常感谢,它很有效。我不明白这个洞的事。