标签: functions

如果索引不存在则创建索引

我正在开发一个函数,如果索引不存在,它允许我添加索引。我遇到了无法获得要比较的索引列表的问题。有什么想法吗?

这与使用此代码解决的列创建问题类似:https :
//stackoverflow.com/a/12603892/368511

postgresql index plpgsql functions postgresql-8.4

74
推荐指数
2
解决办法
9万
查看次数

如何使用表值函数连接表?

我有一个用户定义的函数:

create function ut_FooFunc(@fooID bigint, @anotherParam tinyint)
returns @tbl Table (Field1 int, Field2 varchar(100))
as
begin
  -- blah blah
end
Run Code Online (Sandbox Code Playgroud)

现在我想在另一张桌子上加入这个,就像这样:

select f.ID, f.Desc, u.Field1, u.Field2
from Foo f 
join ut_FooFunc(f.ID, 1) u -- doesn't work
where f.SomeCriterion = 1
Run Code Online (Sandbox Code Playgroud)

换句话说,所有的Foo记录,其中SomeCriterion1,我想看到的Foo IDDesc,旁边的值Field1,并Field2认为从返回ut_FooFunc的的输入Foo.ID

这样做的语法是什么?

join sql-server syntax sql-server-2012 functions

66
推荐指数
1
解决办法
12万
查看次数

SCHEMABINDING 万圣节保护之外的功能是否有任何好处?

众所周知,SCHEMABINDING一个函数可以避免更新计划中不必要的假脱机

如果您使用不涉及任何表(即不访问数据)的简单 T-SQL UDF,请确保SCHEMABINDING在创建 UDF 期间指定该选项。这将使 UDF 模式绑定并确保查询优化器不会为涉及这些 UDF 的查询计划生成任何不必要的假脱机运算符。

SCHEMABINDING即使不访问数据,函数还有其他优势吗?

sql-server functions

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

将所有列记录转换为小写

我正在使用 PostgreSQL 9.1 并且我有一个带有login列的用户表。

登录名区分大小写,例如 Bob、MikE、john。我想将所有这些记录转换为小写。我怎样才能做到这一点?

postgresql functions

38
推荐指数
1
解决办法
4万
查看次数

Postgres 函数中的 SQL 注入与准备好的查询

在 Postgres 中,准备好的查询和用户定义的函数是否等同于一种防止 SQL 注入机制
一种方法比另一种方法有什么特别的优势吗?

postgresql sql-injection prepared-statement plpgsql functions

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

Postgres 函数将查询结果分配给多个变量

我需要在 Postgres 函数中为 2 个变量赋值,如下所示。

a := select col1 from tbl where ...
b := select col2 from tbl where ...
Run Code Online (Sandbox Code Playgroud)

如何在一行命令中为 2 个变量分配 2 个值?

喜欢

a,b := select col1,col2 from tbl where ...
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql functions

36
推荐指数
1
解决办法
7万
查看次数

SQL Server 2019 执行无法访问的代码

[更新:此问题描述了SQL Server 2019 累积更新 5 中已修复的错误。]


考虑以下重现示例(fiddle):

CREATE FUNCTION dbo.Repro (@myYear int)
RETURNS datetime
AS
BEGIN
    IF @myYear <> 1990
    BEGIN
        RETURN NULL
    END

    DECLARE @firstOfYear datetime;
    SET @firstOfYear = DATEFROMPARTS(@myYear, 1, 1);
    
    IF DATEDIFF(day, @firstOfYear, @firstOfYear) <> 0
    BEGIN
        RETURN NULL
    END

    RETURN @firstOfYear
END
SELECT dbo.Repro(0);
Run Code Online (Sandbox Code Playgroud)

显然,如果输入是 ,该函数应该返回 1990 年 1 月的第一天1990NULL否则返回。是的,我知道这DATEDIFF(day, @firstOfYear, @firstOfYear) <> 0是一个荒谬的操作。这是一个演示潜在错误的mcve,而不是生产代码。

现在让我们SELECT dbo.Repro(0)在 SQL Server 2017 和 SQL Server …

sql-server functions sql-server-2019

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

有没有办法防止计算列中的标量 UDF 抑制并行性?

已经有很多关于SQL Server中标量 UDF危险的文章。随意搜索将返回大量结果。

不过,有些地方标量 UDF 是唯一的选择。

例如:处理 XML 时:XQuery 不能用作计算列定义。Microsoft 记录的一种选择是使用标量 UDF将 XQuery 封装在标量 UDF 中,然后在计算列中使用它。

这会产生各种影响和一些解决方法。

  • 查询表时逐行执行
  • 强制对表的所有查询串行运行

您可以通过对函数进行架构绑定来绕过逐行执行,并保留计算列或对其进行索引。即使未引用标量 UDF,这两种方法都不能阻止强制序列化查询表。

有没有一种已知的方法可以做到这一点?

sql-server parallelism functions computed-column

31
推荐指数
2
解决办法
2699
查看次数

添加选择时超出自引用标量函数嵌套级别

目的

在尝试创建自引用函数的测试示例时,一个版本失败而另一个版本成功。

唯一的区别是添加SELECT到函数体导致两者的执行计划不同。


起作用的功能

CREATE FUNCTION dbo.test5(@i int)
RETURNS INT
AS 
BEGIN
RETURN(
SELECT TOP 1
CASE 
WHEN @i = 1 THEN 1
WHEN @i = 2 THEN 2
WHEN @i = 3 THEN  dbo.test5(1) + dbo.test5(2)
END
)
END;
Run Code Online (Sandbox Code Playgroud)

调用函数

SELECT dbo.test5(3);
Run Code Online (Sandbox Code Playgroud)

退货

(No column name)
3
Run Code Online (Sandbox Code Playgroud)

不起作用的功能

CREATE FUNCTION dbo.test6(@i int)
RETURNS INT
AS 
BEGIN
RETURN(
SELECT TOP 1
CASE 
WHEN @i = 1 THEN 1
WHEN @i = 2 THEN 2
WHEN @i = 3 …
Run Code Online (Sandbox Code Playgroud)

sql-server functions sql-server-2017

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

为什么 LEN() 函数严重低估了 SQL Server 2014 中的基数?

我有一个带有字符串列的表和一个检查具有特定长度的行的谓词。在 SQL Server 2014 中,无论我检查的长度如何,我都会看到估计为 1 行。这产生了非常糟糕的计划,因为实际上有数千甚至数百万行,而 SQL Server 选择将此表放在嵌套循环的外侧。

对于 SQL Server 2014 的基数估计为 1.0003 而 SQL Server 2012 估计为 31,622 行,是否有解释?有没有好的解决方法?

以下是该问题的简短再现:

-- Create a table with 1MM rows of dummy data
CREATE TABLE #customers (cust_nbr VARCHAR(10) NOT NULL)
GO

INSERT INTO #customers WITH (TABLOCK) (cust_nbr)
    SELECT TOP 1000000 
        CONVERT(VARCHAR(10),
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS cust_nbr
    FROM master..spt_values v1
    CROSS JOIN master..spt_values v2
GO

-- Looking for string of a certain length.
-- While both CEs …
Run Code Online (Sandbox Code Playgroud)

sql-server varchar functions sql-server-2014 cardinality-estimates

26
推荐指数
2
解决办法
1486
查看次数