函数将检查两个表中的数据,如果数据不同则返回1,如果数据相同则返回0

时间:2016-10-05 16:50:48

标签: sql-server tsql

在T-SQL中编写一个函数,它将接受两个表作为参数。两个表都具有相同的列:

表1 列:ID,Value1 行 ID值1 1 2

表2 列:ID,Value1 行: ID值1 1 2

输出或结果:

0

因为两个表中的记录都相同。

函数将检查两个表中的数据,如果数据不同,则返回1;如果数据相同,则返回0。

1 个答案:

答案 0 :(得分:1)

您无法在函数中执行此操作,因为此类事物需要动态SQL,您无法将其投入功能。唯一的选择是存储过程。也许是这样的:

CREATE PROC dbo.compareTables (@t1 varchar(100), @t2 varchar(100))
AS
DECLARE @sql varchar(2000) =
'SELECT Diff = ISNULL(MAX(1),0)
 FROM
 (
   (SELECT * FROM '+@t2+' EXCEPT SELECT * FROM '+@t1+')
   UNION ALL
   (SELECT * FROM '+@t1+' EXCEPT SELECT * FROM '+@t2+')
 ) x;';

BEGIN TRY
  EXEC (@sql);
END TRY
BEGIN CATCH
  SELECT '<ERROR>';
END CATCH
GO

现在有一些样本表:

CREATE TABLE dbo.table1(col1 int, col2 int);
CREATE TABLE dbo.table2(col1 int, col2 int);
CREATE TABLE dbo.table3(col1 int, col2 int);
CREATE TABLE dbo.table4(col1 int); -- does not have matching columns
INSERT dbo.table1 VALUES (1,1),(2,2),(0,3);
INSERT dbo.table2 VALUES (1,1),(2,2),(3,3); -- table 1 & 2 have diff records
INSERT dbo.table3 VALUES (1,1),(2,2),(3,3); -- table 2 & 3 have all same records

然后你可以像这样使用proc:

EXEC dbo.compareTables 'dbo.table1', 'dbo.table2';  -- returns 1
EXEC dbo.compareTables 'dbo.table2', 'dbo.table3';  -- returns 0
EXEC dbo.compareTables 'dbo.table3', 'dbo.table4';  -- returns <ERROR> because columns dont match