Выберите из таблицы, где идентификаторы отсутствуют в списке идентификаторов - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь выбрать из таблицы, где primary_no (VARCHAR(20)) не включает ни одной из строк в переменную @IDS, но она не работает, и я попытался использовать CTE, не существует ине в. Ни один из них не работает. В запросе по-прежнему выбираются все данные, даже те, чьи имя_символа находится в переменной @IDS.

ALTER PROCEDURE [dbo].[LinkProc]
    @IDS VARCHAR(MAX)
/*
DECLARE @IDS VARCHAR(MAX)
SET @IDS = '
''00000447'',
''0000300'',
''2900071'',
''2900192''
'
EXEC LinkProc @IDS = @IDS    
*/
AS
    WITH cte (id) AS
    (
        SELECT *  
        FROM dbo.splitstring(@IDS)
    )
    SELECT * 
    FROM link_tb 
    WHERE grp_id = 4
      AND status_cd = 'A' 
      AND primary_no NOT IN (SELECT id FROM cte)

Я также попытался безуспешно:

SELECT * 
FROM link_tb lt 
WHERE grp_id = 4 
  AND status_cd = 'A' 
  AND NOT EXISTS (SELECT id FROM cte c WHERE lt.primary_no = c.id)

Результатset from call (SELECT id FROM cte):

'00000447'
'0000300'
'2900071'
'2900192'

Я нашел решение этой проблемы, ответил ниже.

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Отказ от ответственности : из разговора 1005 * выясняется, что OP использует не 2014, а 2005 (что полностью не поддерживается и используется годами). В результате ответ, использующий параметр типа таблицы, не будет работать, поскольку функциональность не существует.

Однако я оставил там ответ для будущих пользователей, у которых есть подобный вопрос.


Вместо использования списка с разделителями используйте параметр типа таблицы

CREATE TYPE dbo.PrimaryList AS TABLE (primary_no varchar(20) NOT NULL);
GO

ALTER PROC dbo.LinkProc @IDs dbo.PrimaryList READONLY AS
BEGIN

    SELECT *
    FROM dbo.link_tb l
         LEFT JOIN @IDs I ON l.primary_no = I.primary_no
    WHERE grp_id = 4
      AND status_cd = 'A' 
      AND I.primary_no IS NULL;

END;
GO

Затем вы можете вызвать SP следующим образом:

DECLARE @IDs dbo.PrimaryList;
INSERT INTO @IDs
VALUES('00000447'),
      ('0000300'),
      ('2900071'),
      ('2900192');

EXEC dbo.LinkProc @IDs;

Редактировать: Почему то, что у вас не работает, это потому, что вы заключаете в кавычки свои значения. То, что вы делаете, эквивалентно:

EXEC dbo.LinkProc @IDs = '''00000447''';

Значение primary_no не будет '00000447', оно просто будет 00000447. Если у вас есть для передачи списка с разделителями (что я предлагаю против, и я не удивлюсь, если ваша функция использует WHILE, и если это так, вам нужно удалитьчто), то не заключайте в кавычки значения:

EXEC dbo.LinkProc @IDs = '00000447,0000300,2900071,2900192';
0 голосов
/ 19 октября 2019

Это было решением моей проблемы. IDS были проанализированы в таблице, и я выбрал оттуда. Моя главная проблема заключалась в том, что я установил @IDS с неправильным форматированием, в строке были разрывы строк. После объединения их без пробелов это сработало.

ALTER PROCEDURE [dbo].[LinkProc]

    @IDS VARCHAR(MAX)

/*

DECLARE @IDS VARCHAR(MAX)

SET @IDS = '00000447,0000300,2900071,2900192'

EXEC LinkProc @IDS = @IDS

*/

AS

SELECT * 
FROM link_tb 
WHERE grp_id = 4 
    AND status_cd = 'A' 
    AND primary_no NOT IN (SELECT param_value FROM dbo.PARSE_PARAM_LIST(@IDS, ','))
...