#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! Изученные кучи!