2014-06-25 63 views
0

是否有一些方法可以与SQL Server一起使用来创建我可以在基于公式/计算字段的查询中使用的变量?迄今为止我看到的例子都只是将变量设置为字面值。SQL Server - 将公式和/或计算字段设置为变量?

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

这将是如此容易得多,看起来那么如果我可以指更清洁这些计算领域的简单变量,而不是复制跨越5+线粘贴他们,看起来像一个完整的一塌糊涂

回答

2

一个简单 - 但丑陋的解决方案是嵌套的select语句:

Select a+(b*c) from (
    select 
     x*y AS a, 
     price/amount AS b, 
     acos(y) AS c 
    from TheTable 
) as q 
+0

热膨胀系数甲骨文的风格;) –

3

您可以创建这样的表值函数:

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 
) 

然后你可以使用CT Es表内的值函数。

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'