视图,存储过程或表定义函数

时间:2011-01-26 20:17:45

标签: sql sql-server tsql

此查询按原样执行。但是,SQL Management Studio不会将其保存为视图,因为我定义了一个变量。

DECLARE @HighestTransaction int

SET @HighestTransaction = (SELECT     MAX(CardID)
                            FROM          dbo.Transactions)

SELECT Uploads.*, Transactions.*
FROM   Uploads LEFT OUTER JOIN
       dbo.Transactions ON dbo.Uploads.Code = dbo.Transactions.CardID
WHERE  (Uploads.Code > CASE WHEN
           @HighestTransaction IS NULL THEN -1  ELSE @HighestTransaction END)

我还没有真正使用存储过程或用户定义的函数,所以我不确定这样做的最佳方法。或者,如果有更好的方式来写这个,我也愿意接受建议。

7 个答案:

答案 0 :(得分:5)

  • 您可以将MAX隔离为CTE
  • MAX没有GROUP BY给出一行,所以你在那里使用ISNULL

像...一样的东西。

WITh cHighestCard AS
(
   SELECT ISNULL(MAX(CardID), -1) AS MaxCard FROM dbo.Transactions
)
SELECT     STAUpload.*, Transactions.*
FROM         dbo.STAUpload LEFT OUTER JOIN
                      dbo.Transactions ON dbo.STAUpload.Code = dbo.Transactions.CardID
WHERE     dbo.STAUpload.Code > MaxCard --edit, error spotted by martin

编辑:不需要CTE:它混合了集合和标量。糟糕。

SELECT     STAUpload.*, Transactions.*
FROM         dbo.STAUpload LEFT OUTER JOIN
                      dbo.Transactions ON dbo.STAUpload.Code = dbo.Transactions.CardID
WHERE     dbo.STAUpload.Code >
            (SELECT ISNULL(MAX(CardID), -1) AS MaxCard
                   FROM dbo.Transactions)

答案 1 :(得分:2)

由于您提到您尝试将其创建为视图,这意味着您可能希望在另一个查询中使用结果。如果这是真的,我会将其设为table-valued function

答案 2 :(得分:0)

这是一个存储过程。这很容易使用。只需告诉管理工作室您想要创建一个新程序,它甚至会为您构建所有基本框架语法。

http://msdn.microsoft.com/en-us/library/ms345415.aspx

答案 3 :(得分:0)

您可以将其重新编码为带有COALESCE的子查询,以避免双重输入:

SELECT ....
  FROM ....
 WHERE dbo.STAUpload.code > COALESCE( 
       (Select max(cardId) from dbo.transactions),-1)

然后它变成了一个观点。

答案 4 :(得分:0)

您可以在存储过程中执行此操作。只需传入您的变量,它就可以正常工作。

快速搜索并查看msdn或在线图书上的存储过程。

答案 5 :(得分:0)

这可能只是一个简单的视图,无需使用CTE即可工作。子查询中针对SELECT MAX的ISNULL可以更容易解释为将ISNULL内插到子查询中。

CREATE VIEW Q_SO
AS
SELECT Uploads.*, Transactions.*
FROM Uploads
LEFT OUTER JOIN dbo.Transactions
    ON dbo.Uploads.Code = dbo.Transactions.CardID
WHERE (Uploads.Code > ISNULL((SELECT MAX(CardID) FROM dbo.Transactions),-1))

作为无参数表值函数

CREATE FUNCTION Q_FN() RETURNS TABLE AS RETURN
SELECT Uploads.*, Transactions.*
FROM Uploads
LEFT OUTER JOIN dbo.Transactions
    ON dbo.Uploads.Code = dbo.Transactions.CardID
WHERE (Uploads.Code > ISNULL((SELECT MAX(CardID) FROM dbo.Transactions),-1))

答案 6 :(得分:0)

Just CROSS JOIN将@HighestTansaction初始化为主查询的子查询,如下所示:

SELECT Uploads.*, Transactions.*
FROM   Uploads LEFT OUTER JOIN
       dbo.Transactions ON dbo.Uploads.Code = dbo.Transactions.CardID CROSS JOIN
       (SELECT ISNULL(MAX(CardID),-1) FROM dbo.Transactions) m(HighestTransaction)
WHERE  (Uploads.Code > m.HighestTransaction)