t-sql - 在 SELECT 语句中为变量赋值

标签 t-sql sql-server-2008

我有这个 SQL Server 查询:

DECLARE @HoursUsed float

SELECT COLUMN_A 
,(SELECT (@HoursUsed = (SELECT dbo.fn_GetProjectHoursUsed(Project.fg_projectId))) 
,@HoursUsed*100
,@HoursUsed*200
FROM Project, OTHER_TABLES)

我需要将函数的结果添加到变量中,因为稍后在查询中的多个位置都需要它。

数据库功能本身运行良好。如果我从 SELECT 中删除变量,它就可以正常工作。

如果我尝试像这样运行查询,它会抛出如下错误:

Incorrect syntax near =, ), as.

整个查询多次使用此函数,但我遇到了性能问题。这就是为什么我想将值放入变量中并仅调用该函数一次。

感谢您的帮助

编辑: 这是完整的查询。

DECLARE @HoursUsed float

SELECT  DISTINCT
    Account.Name as AccountName
    ,Project.FG_SalesRepIdName as Rep
    ,Project.fg_Name as ProjectName
    ,Project.fg_projectId

,(SELECT dbo.fn_GetProjectPriceRate(Project.fg_projectId)) as ProjectPriceRate

,(
SELECT SalesOrder.totalAmount FROM fg_Project, SalesOrder
        WHERE fg_Project.fg_orderId = SalesOrder.salesOrderId 
            AND fg_Project.fg_Name = Project.fg_Name
            AND fg_Project.fg_projectId = Project.fg_projectId
)/dbo.fn_GetProjectPriceRate(Project.fg_projectId) as TotalHours  
    --The total hours are found by division of the total price of the project     with the price rate
    ,(
    SELECT SalesOrder.totalAmount FROM fg_Project, SalesOrder
            WHERE fg_Project.fg_orderId = SalesOrder.salesOrderId 
                AND fg_Project.fg_projectId = Project.fg_projectId
    ) AS TotalAmount

    ,(SELECT @HoursUsed = dbo.fn_GetProjectHoursUsed(Project.fg_projectId)
        SELECT @HoursUsed
    ) as HoursUsed

    ,(
    (SELECT dbo.fn_GetProjectHoursUsed(Project.fg_projectId))
    /
        NULLIF(((SELECT SalesOrder.totalAmount FROM fg_Project, SalesOrder
            WHERE fg_Project.fg_orderId = SalesOrder.salesOrderId 
                AND fg_Project.fg_Name = Project.fg_Name
                AND fg_Project.fg_projectId = Project.fg_projectId
               )
        /
              NULLIF(dbo.fn_GetProjectPriceRate(Project.fg_projectId),0)
             ),0)
    )*100 as PercentHoursUsed
    ,(SELECT dbo.fn_GetProjectHoursBilled(Project.fg_projectId)) as HoursBilled
    ,(SELECT dbo.fn_GetProjectHoursBilled(Project.fg_projectId))
     *
     (SELECT dbo.fn_GetProjectPriceRate(Project.fg_projectId)) as AmountBilled



FROM Account, fg_Project as Project, fg_ProjectElement, Product

WHERE       Account.accountId = Project.fg_regardingId
    AND Project.fg_ProjectId = fg_ProjectElement.fg_projectElemenstId
    AND fg_ProjectElement.fg_ProductId = Product.ProductId
    AND Product.ProductNumber = 'WEB DEV'

最佳答案

我部分猜测您的架构,但也许使用临时表会有所帮助? 例如类似的东西:

DECLARE @HoursUsedTable TABLE (ProjectId int primary key, HoursUsed float)
INSERT @HoursUsedTable (ProjectId, HoursUsed) 
SELECT fg_projectId, dbo.fn_GetProjectHoursUsed(p.fg_projectId) from Project p


SELECT COLUMN_A, 
hu.HoursUsed,
hu.HoursUsed * 100,
hu.HoursUsed * 200
FROM Project p JOIN @HoursUsedTable hu ON hu.ProjectId = p.fg_projectId
, OTHER_TABLES

另请注意,在某些情况下使用标量值 UDF 可能会导致性能问题(我猜测您的 UDF 返回标量?) - 如果可能,最好使用内联表值 UDF。

关于t-sql - 在 SELECT 语句中为变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6784010/

相关文章:

sql - 基于 "type"列组合连续行

sql-server - TSQL 行到列

sql - 如何根据 1 条语句中 SELECT 的结果进行 INSERT 或 UPDATE

sql - 如何从表中选择唯一年份

使用逗号分隔值的 SQL 查询

sql-server - 交叉应用产生空值

union的sql解析

sql-server-2008 - 链接服务器 "Microsoft.ACE.OLEDB.12.0"的 OLE DB 提供程序 "(null)"返回消息 "Bookmark is invalid."

sql - 使用 SSMS 在 SQL Server 2008 中创建 View

从 csv 字符串中搜索 sql