Интеграция табличной функции со значением

#sql-server #tsql

#sql-сервер #tsql

Вопрос:

Благодаря помощи на этом форуме я узнал об использовании функции таблицы значений, чтобы заставить функцию объявления работать таким образом, чтобы ее можно было позже использовать для создания представления. Я просто не знаю, как соединить точки. Функция таблицы значений выглядит следующим образом:

 USE [m_DEV]
GO

--SET ANSI_NULLS ON
--GO

--SET QUOTED_IDENTIFIER ON
--GO

--CREATE VIEW [dbo].[Entries] AS

    CREATE FUNCTION [Manual_COUNTRIES_2019]()
    RETURNS TABLE
    RETURN
        SELECT *
        FROM (       
       VALUES --risk_1
            (1,'AX'),(1,'AY'),(1,'AQ'),(1,'BQ')
            --risk_2 
            ,(2,'AA'),(2,'AI'),(2,'AX')
            -- @risk_3 
            ,(3,'QE'),(3,'QT')
            -- @risk_4 
            ,(4,'AA'),(4,'AB'),(4,'AS'),(4,'AZ')
            -- @risk_5 
            ,(5,'BB'),(5,'BC'),(5,'CD')
    
         ) AS X (RiskNum, Code);
       RETURN
     END;

    
    WITH Lead AS (
        SELECT 
            CASE 
                WHEN a.[10_2_1_Country] IN (SELECT Code from 1 ) THEN '0'   
                WHEN a.[10_2_1_Country] IN (SELECT Code from 2 ) THEN '0.5'   
                WHEN a.[10_2_1_Country] IN (SELECT Code from 3 ) THEN '1'   
                WHEN a.[10_2_1_Country] IN (SELECT Code from 4 ) THEN '2'   
                WHEN a.[10_2_1_Country] IN (SELECT Code from 5 ) THEN '3'
            END AS 'risk_country1'        
        FROM  [dbo].[Manual_Entries_19] a
    )
  

Как вы подключаетесь (RiskNum, Code) с IN (SELECT Code from 1 )
Я пробовал разные варианты. Нужно ли мне вызывать функцию-table: [Manual_COUNTRIES_2019] ? Но как?

Где CREATE VIEW [dbo].[Entries] AS должен располагаться по отношению к CREATE FUNCTION [Manual_COUNTRIES_2019]() ? — Я сомневаюсь, что это будет работать так, как сейчас.

Комментарии:

1. Что такое «объект» 1 ? Если у вас был объект с именем, 1 вам пришлось бы его идентифицировать, поскольку имена объектов, начинающиеся с числового значения, должны быть ( [1] ) . Though, honestly, if you *do* have some objects named, 1 , 2 , 3` и т.д., Я настоятельно рекомендую вам переименовать их.

2. Кроме того, вы объявляете CTE, а затем SELECT из него; приведенный выше SQL кажется неполным. Также обратите внимание, a что псевдоним для Manual_Entries_19 имеет мало смысла. ME19 было бы намного понятнее. Я также надеюсь, что у вас нет таких таблиц, как Manual_Entries_1 , Manual_Entries_2 , Manual_Entries_18 , так как тогда у вас есть сильно денормализованная база данных, которую вы также должны попытаться исправить.

3. @Lamu, спасибо за комментарии. Не беспокойтесь, имена и значения всех таблиц скорректированы и изменены, чтобы я мог представить их в Stack overflow, не раскрывая слишком многого. Итак, да, на самом деле все они имеют другие имена. Все хорошо.

Ответ №1:

Вы получаете значения из своего TVF следующим образом:

 CASE 
    WHEN a.[10_2_1_Country] IN (SELECT Code FROM dbo.Manual_COUNTRIES_2019() WHERE RiskNum = 1) THEN '0'   
    WHEN a.[10_2_1_Country] IN (SELECT Code FROM dbo.Manual_COUNTRIES_2019() WHERE RiskNum = 2) THEN '0.5'   
    WHEN a.[10_2_1_Country] IN (SELECT Code FROM dbo.Manual_COUNTRIES_2019() WHERE RiskNum = 3) THEN '1'   
    WHEN a.[10_2_1_Country] IN (SELECT Code FROM dbo.Manual_COUNTRIES_2019() WHERE RiskNum = 4) THEN '2'   
    WHEN a.[10_2_1_Country] IN (SELECT Code FROM dbo.Manual_COUNTRIES_2019() WHERE RiskNum = 5) THEN '3'
END AS 'risk_country1'
  

Комментарии:

1. Прекрасно, все сработало очень хорошо, и теперь у меня есть возможность просматривать таблицы. Спасибо вам за это 1: 1! Изученные кучи!