标签: table-valued-parameters

将整数数组作为(内联)用户定义函数 (SQL Server) 的参数传递

我有 TBV 功能。像这样

ALTER FUNCTION [dbo].[fn_Functiont]
(
 @accessibleIds   ListAccesableIds READONLY
)
RETURNS TABLE 
AS
RETURN 
(   
SELECT d.*, b.Name AS Name, ps.Name AS PaymentSystemName, c.UserName AS UserName, c.FirstName AS ClientFirstName, c.LastName AS LastName, c.Number AS DocumentNumber, c.Id
FROM Document AS d
JOIN System AS ps ON d.SystemId = ps.Id
JOIN Client AS c ON c.Id = d.ClientId
LEFT JOIN Shop AS b ON b.Id = d.ShopId
WHERE d.OperationTypeId IN (2, 4, 5) AND c.Type = 1
)
Run Code Online (Sandbox Code Playgroud)

我想传递给这个包含整数的函数列表。我想创建表值类型,但这里的问题是我如何将 List 输入参数传递给函数?我知道我可以通过 …

sql-server entity-framework functions sql-server-2014 table-valued-parameters

3
推荐指数
1
解决办法
5620
查看次数

使用 TVP 了解执行计划

我有一些运行缓慢的查询(按月分组的 100 万条记录中的 8 秒),并且一直试图理解执行计划。我们使用大约 10 个 TVP 来发送一组用户选择的过滤器,我有一个索引视图,占查询成本的 84%。

执行计划比较大,不能上传到这里,所以上传到这里了

我花了很多时间来尝试优化这些查询(其中有 14 个,但每个查询的核心都大同小异)并且希望任何人在阅读它们时提出建议或提示。我还实现了实际执行计划建议的查询,但查询速度慢了 5 倍?

performance sql-server execution-plan sql-server-2012 table-valued-parameters query-performance

2
推荐指数
1
解决办法
315
查看次数

获取所有表类型的名称和定义

我知道如何创建表类型(用作表值参数) - 但是一旦创建,我如何查看它?

sql-server t-sql sql-server-2008-r2 table-valued-parameters

2
推荐指数
1
解决办法
8080
查看次数

将表 UDT 传递给表函数时强制执行正确的执行计划

我有一个标量函数,它返回一个大的 XML,它是通过一堆发票创建的。

可以使用几种不同的方法计算要提供给函数的确切发票列表,但函数每次都是相同的。出于这个原因,我声明了一个用户定义的表类型来包含表中的主键eInvoice.Header并将其传递给函数。这样我就可以有几个不同的函数来决定要处理哪些发票,并且只有一个函数可以实际生成 XML:

create function eInvoice.GetRelevantLinesInOneWay()
returns table ...

create function eInvoice.GetRelevantLinesInAnotherWay()
returns table ...

create function eInvoice.GetXML(@lines eInvoice.InvoicePrimaryKeys readonly)
returns xml
as
begin
    declare @x xml;

    with xmlnamespaces(N'important namespace' as pro)
    select @x = (
        select
            ...
        from
            eInvoice.Header h
            inner join @lines l on h.ST_PRIMARY = l.invoice_row_id
        for xml path(N'pro:Import'), type
    );

    return @x;
end;
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种设置已被证明是非常脆弱的。

通常@lines包含大约 150 行(大约1min eInvoce.Header)。正确的执行计划是在 上使用索引查找ST_PRIMARY,当我将 的主体eInvoice.GetXML作为临时查询执行时,总是会发生这种情况。

然而,当我将它存储为一个函数时,它会按预期工作一段时间,然后发生了一些事情(太多行@lines,比如大约300 …

performance sql-server execution-plan sql-server-2012 table-valued-parameters query-performance

1
推荐指数
1
解决办法
822
查看次数