2016-11-07 7 views
1

SQL Serverで2つのテーブルを比較して、それらが同一かどうかを確認するための関数を作成しようとしています。私は2つの例外を除いてそれを行います。ユーザー定義関数のパラメータとして2つのテーブル

テーブルのデータフォーマットとカラム名は同じで、両方のテーブルですべての値が同じです。これは手動によるチェックであるため、違いがある場合は、スローされたエラーは問題になりません。目的は、テーブルを作成する2つの方法が同じテーブルにつながるかどうかを確認することです。

私は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 

: 私はこのような何かを得るために、関数のパラメータとして両方のテーブルを渡したいですか? 誰かが私を助けることができますか?

+0

。 2つのテーブルがまったく同じ列とデータ型を持たない場合は、失敗します。もちろん、これはまず関数を動的SQLに変換することに依存します。 –

+0

もちろん、テーブル値のパラメータを使用しようとしていない限り、関数内でこれを行うことができます。しかし、あなたが投稿したコードにはデータ型がありませんので、ここでは推測しています。 –

+0

ああ、私は質問でそれを明確にします。テーブルはまったく同じで、同じデータフォーマットとカラム名であると想定されています。これは手動によるチェックであるため、違いがある場合は、スローされたエラーは問題になりません。 – aldorado

答えて

0

これは機能では実行できません。テーブル名をパラメータとして渡す唯一の方法は、動的SQLを使用することです。動的SQLは関数では使用できません。ストアドプロシージャで実行できます。

+0

これはストアドプロシージャのように見えますか? – aldorado

+0

RETURNを使用する代わりに、ストアドプロシージャは動的SQLを使用してSELECTを実行します。 –

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 [email protected]) base 
     where column_name not in (SELECT column_name FROM information_schema.COLUMNS WHERE [email protected])) 

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

END 
+0

私はOPが実際の列ではなく内容に興味があると確信しています。 –

0

[OK]を私が構築されたものを:

私はこれは私が何をしたいんだと思う:これはエラーを非常に受けやすいことになるだろう

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 
関連する問題