2016-11-07 3 views
1

Я пытаюсь создать функцию в 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 

Как это сделано правильно? Может ли кто-нибудь мне помочь?

+0

Это собирается быть очень склонны к ошибкам. Если в двух таблицах нет одинаковых столбцов и типов данных, они будут терпеть неудачу. Разумеется, все это в первую очередь зависит от того, чтобы получить это из функции и в динамический sql. –

+0

Если вы, конечно, не пытаетесь использовать параметры таблицы, которые вы могли бы сделать это в функции. Но код, который вы опубликовали, не имеет типа данных, поэтому мы довольно угадываем здесь. –

+0

О да, я сделаю это ясно в вопросе. Таблицы должны быть точно такими же, с теми же форматами данных и именами столбцов. Это будет ручная проверка, поэтому, если различия там, брошенная ошибка не является проблемой. – aldorado

ответ

0

Вы не можете сделать это в функции. Единственный способ передать имена таблиц в качестве параметров - использовать Dynamic SQL, а Dynamic SQL не допускается в функциях. Вы можете сделать это с помощью хранимой процедуры.

+0

Тогда как это будет выглядеть как хранимая процедура? – aldorado

+0

Вместо использования RETURN хранимая процедура будет просто выполнять SELECT, используя динамический SQL. –

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 
Смежные вопросы