SQL Server-将公式和/或计算字段设置为变量?
有什么方法可以用于SQL Server来创建基于公式/计算字段的查询中使用的变量吗?到目前为止,我看到的示例都只涉及将变量=设置为文字值 对于我正在处理的查询,我需要得到的一些计算字段是基于多个其他计算字段之间的广泛公式的,通常在过程中使用类型转换。当我想进一步构建时,为嵌套的IIF语句使用所有这些不同的计算字段,将它们全部写在语句中开始变得非常麻烦SQL Server-将公式和/或计算字段设置为变量?,sql,sql-server,Sql,Sql Server,有什么方法可以用于SQL Server来创建基于公式/计算字段的查询中使用的变量吗?到目前为止,我看到的示例都只涉及将变量=设置为文字值 对于我正在处理的查询,我需要得到的一些计算字段是基于多个其他计算字段之间的广泛公式的,通常在过程中使用类型转换。当我想进一步构建时,为嵌套的IIF语句使用所有这些不同的计算字段,将它们全部写在语句中开始变得非常麻烦 如果我可以将这些计算字段作为简单变量引用,而不是将它们复制粘贴到5+行中,看起来像一团乱麻,那么会更容易,看起来也更干净。一个简单但丑陋的解决方案
如果我可以将这些计算字段作为简单变量引用,而不是将它们复制粘贴到5+行中,看起来像一团乱麻,那么会更容易,看起来也更干净。一个简单但丑陋的解决方案是使用嵌套的select语句:
Select a+(b*c) from (
select
x*y AS a,
price/amount AS b,
acos(y) AS c
from TheTable
) as q
一个简单但丑陋的解决方案是使用嵌套的select语句:
Select a+(b*c) from (
select
x*y AS a,
price/amount AS b,
acos(y) AS c
from TheTable
) as q
您可以创建如下表值函数:
CREATE FUNCTION [dbo].[tfu_RPT_SEL_Benutzer]
(
@in_mandant varchar(3)
,@in_sprache varchar(2)
,@in_show_alle bit = 1
)
RETURNS TABLE
AS
RETURN
(
SELECT
BE_ID AS RPT_ID
,@in_mandant AS RPT_MDT_ID
,BE_Vorname AS RPT_Vorname
,BE_Name AS RPT_Nachname
,BE_User AS RPT_User
,
CASE
WHEN LEN(ISNULL(BE_Vorname + ' ', '') + ISNULL(BE_Name, '') ) > 0
THEN ISNULL(BE_Vorname + ' ', '') + ISNULL(BE_Name, '')
ELSE BE_User
END AS RPT_Name
,0 AS RPT_Sort
FROM T_Benutzer
UNION
SELECT
0 AS RPT_ID
,@in_mandant AS RPT_MDT_ID
,'' AS RPT_Vorname
,'' AS RPT_Nachname
,
(
SELECT TOP(1)
CASE UPPER(@in_sprache)
WHEN 'FR' THEN T_RPT_Translations.RTR_Kurz_FR
WHEN 'IT' THEN T_RPT_Translations.RTR_Kurz_IT
WHEN 'EN' THEN T_RPT_Translations.RTR_Kurz_EN
ELSE T_RPT_Translations.RTR_Kurz_DE
END AS RTR_Kurz
FROM T_RPT_Translations
WHERE (RTR_Status = 1)
AND (RTR_MDT_ID = 0)
AND (RTR_ReportName = 'All')
--AND (RTR_IsFlag = 1)
AND (RTR_ItemCaption = 'NA')
--AND (RTR_Code = 1)
) AS RPT_User
,
(
SELECT TOP(1)
CASE UPPER(@in_sprache)
WHEN 'FR' THEN T_RPT_Translations.RTR_Lang_FR
WHEN 'IT' THEN T_RPT_Translations.RTR_Lang_IT
WHEN 'EN' THEN T_RPT_Translations.RTR_Lang_EN
ELSE T_RPT_Translations.RTR_Lang_DE
END AS RTR_Lang
FROM T_RPT_Translations
WHERE (RTR_Status = 1)
AND (RTR_MDT_ID = 0)
AND (RTR_ReportName = 'All')
--AND (RTR_IsFlag = 1)
AND (RTR_ItemCaption = 'NA')
--AND (RTR_Code = 1)
) AS RPT_Name
,999999999 AS RPT_Sort
WHERE @in_show_alle = 1
)
然后可以在表值函数中使用CTE
DECLARE @i integer
SET @i=5
;WITH CTE AS (
SELECT
BE_ID
,BE_ID * @i as idmul
FROM T_Benutzer
)
SELECT * FROM CTE
WHERE idmul > 62000
并从函数中进行查询
DECLARE @in_mandant varchar(3)
,@in_sprache varchar(2)
,@in_show_alle bit = 1
SET @in_mandant = '0'
SET @in_sprache = 'DE'
SET @in_show_alle = 'true'
SELECT *
FROM tfu_RPT_SEL_Benutzer( @in_mandant, @in_sprache, @in_show_alle )
WHERE RPT_User = 'N/A'
您可以创建如下表值函数:
CREATE FUNCTION [dbo].[tfu_RPT_SEL_Benutzer]
(
@in_mandant varchar(3)
,@in_sprache varchar(2)
,@in_show_alle bit = 1
)
RETURNS TABLE
AS
RETURN
(
SELECT
BE_ID AS RPT_ID
,@in_mandant AS RPT_MDT_ID
,BE_Vorname AS RPT_Vorname
,BE_Name AS RPT_Nachname
,BE_User AS RPT_User
,
CASE
WHEN LEN(ISNULL(BE_Vorname + ' ', '') + ISNULL(BE_Name, '') ) > 0
THEN ISNULL(BE_Vorname + ' ', '') + ISNULL(BE_Name, '')
ELSE BE_User
END AS RPT_Name
,0 AS RPT_Sort
FROM T_Benutzer
UNION
SELECT
0 AS RPT_ID
,@in_mandant AS RPT_MDT_ID
,'' AS RPT_Vorname
,'' AS RPT_Nachname
,
(
SELECT TOP(1)
CASE UPPER(@in_sprache)
WHEN 'FR' THEN T_RPT_Translations.RTR_Kurz_FR
WHEN 'IT' THEN T_RPT_Translations.RTR_Kurz_IT
WHEN 'EN' THEN T_RPT_Translations.RTR_Kurz_EN
ELSE T_RPT_Translations.RTR_Kurz_DE
END AS RTR_Kurz
FROM T_RPT_Translations
WHERE (RTR_Status = 1)
AND (RTR_MDT_ID = 0)
AND (RTR_ReportName = 'All')
--AND (RTR_IsFlag = 1)
AND (RTR_ItemCaption = 'NA')
--AND (RTR_Code = 1)
) AS RPT_User
,
(
SELECT TOP(1)
CASE UPPER(@in_sprache)
WHEN 'FR' THEN T_RPT_Translations.RTR_Lang_FR
WHEN 'IT' THEN T_RPT_Translations.RTR_Lang_IT
WHEN 'EN' THEN T_RPT_Translations.RTR_Lang_EN
ELSE T_RPT_Translations.RTR_Lang_DE
END AS RTR_Lang
FROM T_RPT_Translations
WHERE (RTR_Status = 1)
AND (RTR_MDT_ID = 0)
AND (RTR_ReportName = 'All')
--AND (RTR_IsFlag = 1)
AND (RTR_ItemCaption = 'NA')
--AND (RTR_Code = 1)
) AS RPT_Name
,999999999 AS RPT_Sort
WHERE @in_show_alle = 1
)
然后可以在表值函数中使用CTE
DECLARE @i integer
SET @i=5
;WITH CTE AS (
SELECT
BE_ID
,BE_ID * @i as idmul
FROM T_Benutzer
)
SELECT * FROM CTE
WHERE idmul > 62000
并从函数中进行查询
DECLARE @in_mandant varchar(3)
,@in_sprache varchar(2)
,@in_show_alle bit = 1
SET @in_mandant = '0'
SET @in_sprache = 'DE'
SET @in_show_alle = 'true'
SELECT *
FROM tfu_RPT_SEL_Benutzer( @in_mandant, @in_sprache, @in_show_alle )
WHERE RPT_User = 'N/A'