Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-将公式和/或计算字段设置为变量?_Sql_Sql Server - Fatal编程技术网

SQL Server-将公式和/或计算字段设置为变量?

SQL Server-将公式和/或计算字段设置为变量?,sql,sql-server,Sql,Sql Server,有什么方法可以用于SQL Server来创建基于公式/计算字段的查询中使用的变量吗?到目前为止,我看到的示例都只涉及将变量=设置为文字值 对于我正在处理的查询,我需要得到的一些计算字段是基于多个其他计算字段之间的广泛公式的,通常在过程中使用类型转换。当我想进一步构建时,为嵌套的IIF语句使用所有这些不同的计算字段,将它们全部写在语句中开始变得非常麻烦 如果我可以将这些计算字段作为简单变量引用,而不是将它们复制粘贴到5+行中,看起来像一团乱麻,那么会更容易,看起来也更干净。一个简单但丑陋的解决方案

有什么方法可以用于SQL Server来创建基于公式/计算字段的查询中使用的变量吗?到目前为止,我看到的示例都只涉及将变量=设置为文字值

对于我正在处理的查询,我需要得到的一些计算字段是基于多个其他计算字段之间的广泛公式的,通常在过程中使用类型转换。当我想进一步构建时,为嵌套的IIF语句使用所有这些不同的计算字段,将它们全部写在语句中开始变得非常麻烦


如果我可以将这些计算字段作为简单变量引用,而不是将它们复制粘贴到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'