【问题标题】:Change T-SQL Query Using an INSERT with Table Valued Function into a View Instead使用带有表值函数的 INSERT 将 T-SQL 查询更改为视图
【发布时间】:2016-05-05 04:09:47
【问题描述】:

查询涉及一个包含联系人数据的表。表值函数用于返回每个联系人的“状态”。

insert 语句从联系人表中获取唯一键并将其加载到名为@filteredIdList 的变量中。然后通过将变量 @filteredIdList 传递给它,将其连接到 Contacts 表并再次连接到表值函数。

我已简化示例以显示我当前如何返回状态。这需要改为视图:

DECLARE @filteredIdList IdList;
INSERT INTO @filteredIdList SELECT ContactID FROM Contacts

SELECT 
       Contacts.ContactID, 
       Contact_Status

FROM   Contacts
       INNER JOIN @filteredIdList [IDLIST] ON Contacts.ContactID = [IDLIST].[id]
       INNER JOIN tvfContact_Status(@filteredIdList) Contact_Status
       ON [IDLIST].[id] = Contact_Status.ContactID

我尝试在视图中将其创建为 CTE,但无法弄清楚。

【问题讨论】:

    标签: sql-server tsql view common-table-expression table-valued-parameters


    【解决方案1】:

    我相信您正在寻找的 CTE 会是。

    ;with nameofcte (IdList) as (
      select ContactID from Contacts
    )
    

    那么您只需在 join 语句中使用 nameofcte。

    我不是每天都使用 CTE,所以我通常会先阅读一下 Simple Talk 上的这篇文章,以便在使用它们之前重新了解它们。 https://www.simple-talk.com/sql/t-sql-programming/sql-server-cte-basics/

    【讨论】:

    • 嗨,迈克,这就是问题所在。我不确定我应该如何将 CTE 的结果传递到表值函数中。因此,例如,这不起作用:
    • WITH Contact_Status (Id) AS(从 Contacts 中选择不同的 ContactID) SELECT C.ContactID, ContactStatus FROM Contacts C INNER JOIN Contact_Status on Contact_Status.Id = C.ContactID INNER JOIN dbo.tvfContact_Status(Contact_Status.Id ) ContactStatus ON Contact_Status.Id = C.ContactID
    • 它说:Msg 4104, Level 16, State 1, Line 28 无法绑定多部分标识符“Contact_Status.Id”。
    • 尝试子选择 dbo.tvfContact_Status(select Id from Contact_Status) 您可能需要子选择的前 1 个,但从示例中它似乎只返回一个值。
    • 我给出的初始查询返回了数千行,它应该以及我希望新查询执行的操作。关于尝试使用子选择,该函数似乎不知道该怎么做:Msg 156, Level 15, State 1, Line 83 关键字“select”附近的语法不正确。
    【解决方案2】:

    不知道为什么您需要在这里查看,但如果您想这样做,请尝试以下方式

    由于tvfContact_Status 用于返回每个联系人的状态。将Table valued function 更改为Scalar function

    首先修改tvfContact_Status函数

    ALTER FUNCTION dbo.tvfContact_Status(@ContactID int)
    RETURNS varchar(50) --Status
    AS 
    BEGIN
        --------
        RETURN @Status;
    END;
    GO
    

    像这样创建View

    CREATE VIEW Contact_View
    AS
    SELECT 
           Contacts.ContactID, 
           dbo.tvfContact_Status(ContactID) as Contact_Status
    FROM   Contacts
    

    注意:这不是一种有效的方法

    【讨论】:

    • 您好 VR46,感谢您的回复。这些曾经是标量函数,由于性能问题(它们是 CLR/.net 运行时),供应商将其更改为表值。我们必须找到一种方法将它们作为表值处理,因为它们有数千个(长话短说)。
    • @user3491557 - 你能添加tvfContact_Status代码
    • 我必须先对代码进行清理,然后才能粘贴它。今天没有时间,但明天会有所收获。谢谢
    • @user3491557 - 没有问题。编辑问题后,只需在此处发表评论。会调查的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多