我正在开发一个函数,如果索引不存在,它允许我添加索引。我遇到了无法获得要比较的索引列表的问题。有什么想法吗?
这与使用此代码解决的列创建问题类似:https :
//stackoverflow.com/a/12603892/368511
我有一个用户定义的函数:
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 ID和Desc,旁边的值Field1,并Field2认为从返回ut_FooFunc的的输入Foo.ID。
这样做的语法是什么?
我正在使用 PostgreSQL 9.1 并且我有一个带有login列的用户表。
登录名区分大小写,例如 Bob、MikE、john。我想将所有这些记录转换为小写。我怎样才能做到这一点?
在 Postgres 中,准备好的查询和用户定义的函数是否等同于一种防止 SQL 注入的机制?
一种方法比另一种方法有什么特别的优势吗?
postgresql sql-injection prepared-statement plpgsql functions
我需要在 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) [更新:此问题描述了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 月的第一天1990,NULL否则返回。是的,我知道这DATEDIFF(day, @firstOfYear, @firstOfYear) <> 0是一个荒谬的操作。这是一个演示潜在错误的mcve,而不是生产代码。
现在让我们SELECT dbo.Repro(0)在 SQL Server 2017 和 SQL Server …
目的
在尝试创建自引用函数的测试示例时,一个版本失败而另一个版本成功。
唯一的区别是添加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 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
functions ×10
sql-server ×6
postgresql ×4
plpgsql ×3
index ×1
join ×1
parallelism ×1
syntax ×1
varchar ×1