Взять общее между 2 списком переменных - PullRequest
0 голосов
/ 03 октября 2019

Учитывая следующее утверждение:

DECLARE @table_source NVARCHAR(255) = 'ID,PERSONID,ALTROCAMPO,ANCORA,GENDER,LASTNAME,PRIMARYNAME'
DECLARE @table_target NVARCHAR(255) = 'ID,PERSONID,GENDER,LASTNAME,DATES,PRIMARYNAME'

Как мне взять только общее?

Результат должен выглядеть примерно так:

@result = 'ID,PERSONID,GENDER,LASTNAME,PRIMARYNAME'

Спасибо всем

Ответы [ 2 ]

3 голосов
/ 03 октября 2019

Предполагая, что вы используете последнюю версию SQL Server, и вы должны использовать значения с разделителями, используйте STRING_SPLIT и STRING_AGG:

DECLARE @table_source nvarchar(255) = N'ID,PERSONID,ALTROCAMPO,ANCORA,GENDER,LASTNAME,PRIMARYNAME';
DECLARE @table_target nvarchar(255) = N'ID,PERSONID,GENDER,LASTNAME,DATES,PRIMARYNAME';

    WITH TS AS(
        SELECT SS.[value]
        FROM STRING_SPLIT(@table_source,',') SS),
    TT AS(
        SELECT SS.[value]
        FROM STRING_SPLIT(@table_target,',') SS)
    SELECT STRING_AGG(TS.[value],',') AS Result
    FROM TS
         JOIN TT ON TS.[value] = TT.[value];

Если вы не пользуетесь последней версией, вам необходимо заменить их разделителем строк (например, delimitedsplitN4K_LEAD) и использовать метод FOR XML PATH & STUFF соответственно для каждой функции, которую вы надеваетенет доступа к.

Как я уже сказал, на самом деле вы должны использовать параметр табличного типа, и тогда это тривиально. при условии, что это имена столбцов, вы можете сделать:

--Create the type
CREATE TYPE dbo.Object_List AS TABLE (ObjectName sysname);
GO

--Declare variables
DECLARE @table_source dbo.Object_List;
INSERT INTO @table_source (ObjectName)
VALUES (N'ID'),(N'PERSONID'),(N'ALTROCAMPO'),(N'ANCORA'),(N'GENDER'),(N'LASTNAME'),(N'PRIMARYNAME')

DECLARE @table_target dbo.Object_List;
INSERT INTO @table_target (ObjectName)
VALUES (N'ID'),(N'PERSONID'),(N'ALTROCAMPO'),(N'ANCORA'),(N'GENDER'),(N'LASTNAME'),(N'PRIMARYNAME')

--Solution
SELECT ObjectName
FROM @table_source TS
WHERE EXISTS (SELECT 1
              FROM @table_target TT
              WHERE TS.ObjectName = TT.ObjectName);
0 голосов
/ 04 октября 2019

Спасибо всем, я решил с помощью LARNU. В соответствии с последним вопросом, я присваиваю результат переменной. Вот код:

WITH TS AS (
        SELECT SS.[value]
        FROM STRING_SPLIT(@table_source,',') as SS),
    TT AS (
        SELECT SS.[value]
        FROM STRING_SPLIT(@table_target,',') as SS)
        SELECT @result = STRING_AGG(TS.[value],',')
FROM TS
         JOIN TT ON TS.[value] = TT.[value];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...