Advertisement
Guest User

sql server generate merge statement

a guest
Jun 24th, 2018
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 2.43 KB | None | 0 0
  1.  
  2. CREATE FUNCTION system.GenerateMERGE
  3. (
  4.     @TABLESCHEMA    NAME,
  5.     @TABLENAME      NAME
  6. )
  7. RETURNS VARCHAR(MAX)
  8. AS
  9. BEGIN
  10.     DECLARE @RV     VARCHAR(MAX) = ''
  11.     DECLARE @CRLF   VARCHAR(2) = CHAR(13)+CHAR(10)
  12.     DECLARE @TAB    VARCHAR(1) = CHAR(9)
  13.  
  14.     DECLARE @IDENT  BIT = (SELECT OBJECTPROPERTY(OBJECT_ID(@TABLESCHEMA+'.'+@TABLENAME), 'TableHasIdentity'))
  15.  
  16.     IF @IDENT != 0 SELECT @RV = 'SET IDENTITY_INSERT '+@TABLESCHEMA+'.'+@TABLENAME+' ON'+@CRLF
  17.  
  18.     SELECT @RV = @RV + 'MERGE INTO '+@TABLESCHEMA+'.'+@TABLENAME+' D'+@CRLF+
  19.                  'USING (<enter source query here>) S'+@CRLF+'ON '
  20.    
  21.     SELECT @RV = @RV+'S.'+PK.TABLE_FIELD+' = D.'+TABLE_FIELD+' AND '
  22.     FROM system.PKCOLS PK
  23.     WHERE PK.TABLE_SCHEMA = @TABLESCHEMA AND PK.TABLE_NAME = @TABLENAME
  24.     ORDER BY PK.ORDINAL_POSITION
  25.     SELECT @RV = LEFT(@RV, LEN(@RV) - 4)+@CRLF
  26.  
  27.     SELECT @RV = @RV+'WHEN MATCHED UPDATE SET'+@CRLF
  28.     SELECT @RV = @RV+@TAB+C.COLUMN_NAME+' = S.'+C.COLUMN_NAME+','+@CRLF
  29.     FROM INFORMATION_SCHEMA.COLUMNS C
  30.     LEFT JOIN system.PKCOLS PK ON PK.TABLE_SCHEMA = C.TABLE_SCHEMA AND PK.TABLE_NAME = C.TABLE_NAME AND PK.TABLE_FIELD = C.COLUMN_NAME
  31.     WHERE C.TABLE_SCHEMA = @TABLESCHEMA AND C.TABLE_NAME = @TABLENAME AND PK.TABLE_FIELD IS NULL
  32.             AND COLUMNPROPERTY(OBJECT_ID(@TABLESCHEMA+'.'+@TABLENAME), C.COLUMN_NAME, 'IsComputed') = 0
  33.     ORDER BY C.ORDINAL_POSITION
  34.     SELECT @RV = LEFT(@RV, LEN(@RV) - 3)+@CRLF
  35.  
  36.     SELECT @RV = @RV+'WHEN NOT MATCHED'+@CRLF+@TAB+'INSERT ('
  37.     SELECT @RV = @RV+C.COLUMN_NAME+', '
  38.     FROM INFORMATION_SCHEMA.COLUMNS C
  39.     LEFT JOIN system.PKCOLS PK ON PK.TABLE_SCHEMA = C.TABLE_SCHEMA AND PK.TABLE_NAME = C.TABLE_NAME AND PK.TABLE_FIELD = C.COLUMN_NAME
  40.     WHERE C.TABLE_SCHEMA = @TABLESCHEMA AND C.TABLE_NAME = @TABLENAME
  41.             AND COLUMNPROPERTY(OBJECT_ID(@TABLESCHEMA+'.'+@TABLENAME), C.COLUMN_NAME, 'IsComputed') = 0
  42.     ORDER BY C.ORDINAL_POSITION
  43.     SELECT @RV = LEFT(@RV, LEN(@RV) - 1)+')'+@CRLF+@TAB+'VALUES ('
  44.  
  45.     SELECT @RV = @RV+'S.'+C.COLUMN_NAME+', '
  46.     FROM INFORMATION_SCHEMA.COLUMNS C
  47.     LEFT JOIN system.PKCOLS PK ON PK.TABLE_SCHEMA = C.TABLE_SCHEMA AND PK.TABLE_NAME = C.TABLE_NAME AND PK.TABLE_FIELD = C.COLUMN_NAME
  48.     WHERE C.TABLE_SCHEMA = @TABLESCHEMA AND C.TABLE_NAME = @TABLENAME
  49.             AND COLUMNPROPERTY(OBJECT_ID(@TABLESCHEMA+'.'+@TABLENAME), C.COLUMN_NAME, 'IsComputed') = 0
  50.     ORDER BY C.ORDINAL_POSITION
  51.     SELECT @RV = LEFT(@RV, LEN(@RV) - 1)+');'+@CRLF
  52.  
  53.     IF @IDENT != 0 SELECT @RV = @RV+'SET IDENTITY_INSERT '+@TABLESCHEMA+'.'+@TABLENAME+' OFF'+@CRLF
  54.  
  55.     RETURN @RV
  56. END
  57. GO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement