两个表作为用户定义函数的参数

时间:2016-11-07 15:24:49

标签: sql-server function compare udf

我正在尝试在SQL SERVER中创建一个函数,我可以使用它来比较两个表,以检查它们是否相同。我这样做有两个例外。

表应该完全相同,两个表中的数据格式和列名相同,所有值都相同。这将是一次手动检查,因此如果存在差异,则抛出的错误不是问题。目的只是看两种创建表的方法是否导致相同的表。

我对SQL中的函数很新,所以我不知道如何解决这个问题。 我想将两个表作为参数传递给函数,得到这样的结果:

CREATE FUNCTION DIFFERING_ROWS
(@TABLE1, @TABLE2)
RETURNS TABLE

AS
RETURN (
    SELECT *, 'A_not_B' as [Difference] FROM @TABLE1
    except
    SELECT *, 'A_not_B' as [Difference] FROM @TABLE2
    union all
    SELECT *, 'B_not_A' as [Difference] FROM @TABLE2
    except
    SELECT *, 'B_not_A' as [Difference] FROM @TABLE1
    )
END

如何正确实施? 有人能帮助我吗?

3 个答案:

答案 0 :(得分:0)

您无法在功能中执行此操作。将表名作为参数传递的唯一方法是使用动态SQL,并且函数中不允许使用动态SQL。您可以使用存储过程来完成它。

答案 1 :(得分:0)

您可以创建此存储过程,以计算表中是否具有相同的column_names:

CREATE PROCEDURE checkEqualTables
@table1 varchar(100),
@table2 varchar(100)
AS
BEGIN

DECLARE @xCount int;

(SELECT @xCount = COUNT(*) from (SELECT column_name FROM information_schema.COLUMNS WHERE table_name=@table1) base
         where column_name not in (SELECT column_name FROM information_schema.COLUMNS WHERE table_name=@table2))

IF(@xCount <= 0)    
    print 'Tables are equal!';
ELSE
    print 'Tables are not equal!'    

END

答案 2 :(得分:0)

好的,我从答案和评论中获取了信息,并研究了如何将其纳入程序,这就是我所建立的:

我认为这符合我的要求:

CREATE PROCEDURE checkEqualTables
@table1 nvarchar(100),
@table2 nvarchar(100)
AS
BEGIN
    DECLARE @SQL nvarchar(max);

SET @SQL =  'SELECT * FROM '    + @TABLE1 +
            'except
            SELECT * FROM '     + @TABLE2 +
            'union all
            SELECT * FROM '     + @TABLE2 +
            'except
            SELECT * FROM '     + @TABLE1    
    EXECUTE sp_executesql @SQL

END