stored procedures - insert ignoring duplicates using TSQL -


i have table unique constraint on 2 columns:

create table migration_dictionaries.dbo._tablequeue_ (     id int identity primary key,     tablename varchar(250),     tablefrom varchar(250),     keyname varchar(250),     processed int default 0,      constraint [uq_codes] unique nonclustered     (         tablename, tablefrom     ) ) 

in procedure trying implement need insert bunch of records using insert (...) select. now, how can make sure rows duplicate constraint ignored other rows given select statement still saved?

the query insert:

insert migration_dictionaries.dbo._tablequeue_ (tablename, tablefrom, keyname) select 'some_table_name', t.name tablewithforeignkey, c.name foreignkeycolumn  sys.foreign_key_columns fk inner join sys.tables t on fk.parent_object_id = t.object_id inner join sys.columns c on fk.parent_object_id = c.object_id , fk.parent_column_id = c.column_id fk.referenced_object_id = (select object_id sys.tables name = 'some_table_name') 

[edit] ended following query:

merge migration_dictionaries.dbo._tablequeue_ t using (     select 'sometable' tablefrom, t.name tablewithforeignkey, c.name foreignkeycolumn      sys.foreign_key_columns fk     inner join sys.tables t on fk.parent_object_id = t.object_id     inner join sys.columns c on fk.parent_object_id = c.object_id , fk.parent_column_id = c.column_id     fk.referenced_object_id = (select object_id sys.tables name = 'sometable') ) s on (t.tablename = s.tablewithforeignkey , t.tablefrom = s.tablefrom) when not matched target     insert (tablename, tablefrom, keyname)     values (s.tablefrom, s.tablewithforeignkey, s.foreignkeycolumn); 

but when run still constraint error:

violation of unique key constraint 'uq_codes'. cannot insert duplicate key in object 'dbo._tablequeue_'. duplicate key value (up_opiekun, up_uczen). statement has been terminated. 

what do wrong?

for sql server 2008 can use merge statement "when not matched target" clause insert. don't use "when matched" clause

more generally, can use

insert dbo._tablequeue_    (....) select    ...    source s    not exists (select *       dbo._tablequeue_ t                s.tablename = t.tablename , s.tablefrom = t.tablefrom       ) 

after comment:

merge dbo._tablequeue_ t using source s        on s.tablename = t.tablename , s.tablefrom = t.tablefrom when not matched target    insert (...)    values (s.x. s.y, ...); 

Comments

Popular posts from this blog

jquery - How can I dynamically add a browser tab? -

node.js - Getting the socket id,user id pair of a logged in user(s) -

keyboard - C++ GetAsyncKeyState alternative -