在T-SQL中编写一个函数,它将接受两个表作为参数。两个表都具有相同的列:
表1 列:ID,Value1 行 ID值1 1 2
表2 列:ID,Value1 行: ID值1 1 2
输出或结果:
0
因为两个表中的记录都相同。
函数将检查两个表中的数据,如果数据不同,则返回1;如果数据相同,则返回0。
答案 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