Questions tagged «functions»

函数执行某些指定的工作,通常以参数为输入。就数据库而言,它们可能特定于SQL或数据库供应商。


2
如何用表值函数联接表?
我有一个用户定义的函数: create function ut_FooFunc(@fooID bigint, @anotherParam tinyint) returns @tbl Table (Field1 int, Field2 varchar(100)) as begin -- blah blah end 现在,我想将其加入另一个表,如下所示: 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 换句话说,对于所有Foo记录,其中SomeCriterion均为1,我想查看Foo ID和Desc以及输入所返回的Field1和的值。Field2ut_FooFuncFoo.ID 这样做的语法是什么?

1
除万圣节保护外,SCHEMABINDING功能还有什么好处?
众所周知,SCHEMABINDING函数可以避免更新计划中不必要的假脱机: 如果您使用的是不触摸任何表(即不访问数据)的简单T-SQL UDF,请确保SCHEMABINDING在创建UDF时指定了该选项。这将使UDF成为模式绑定,并确保查询优化器不会为涉及这些UDF的查询计划生成任何不必要的假脱机操作符。 SCHEMABINDING即使不访问数据,该功能还有其他优点吗?


2
有没有一种方法可以防止计算列中的标量UDF抑制并行性?
关于SQL Server 中标量UDF的危害,已经写了很多文章。随意搜索将返回大量结果。 但是,在某些地方,标量UDF是唯一的选择。 例如:在处理XML时:XQuery不能用作计算列定义。Microsoft记录的一个选项是使用Scalar UDF将XQuery封装在Scalar UDF中,然后在计算列中使用它。 这会产生各种影响,并有一些解决方法。 查询表时逐行执行 强制对表的所有查询顺序运行 您可以通过模式绑定该函数并持久保存计算的列或对其进行索引来解决逐行执行的问题。即使没有引用标量UDF,这两种方法都无法防止查询的强制序列化。 有已知的方法吗?

1
将所有列记录转换为小写
我正在使用PostgreSQL 9.1,并且我的用户表带有一login列。 登录名区分大小写,例如Bob,MikE和john。我想将所有这些记录转换为小写。我怎样才能做到这一点?


2
为什么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 …

1
添加选择时超出自引用标量函数嵌套级别
目的 尝试创建自引用功能的测试示例时,一个版本失败,而另一个版本成功。 唯一的区别是添加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; 调用函数 SELECT dbo.test5(3); 退货 (No column name) 3 该功能不起作用 CREATE …

9
使用T-SQL测试字符串是否是回文
我是T-SQL的初学者。我想确定输入字符串是否是回文,如果不是,则输出= 0,如果是,则输出= 1。我仍然在弄清楚语法。我什至没有收到错误消息。我正在寻找不同的解决方案和一些反馈,以更好地理解和了解T-SQL的工作原理,并且变得更好-我仍然是一名学生。 正如我所看到的,关键思想是将最左边和最右边的字符相互比较,检查是否相等,然后将左边的第二个字符与最后一个的第二个字符进行比较,依此类推。我们做一个循环:如果字符彼此相等,我们继续。如果到达末尾,则输出1;否则,输出0。 您能否批评一下: CREATE function Palindrome( @String Char , @StringLength Int , @n Int , @Palindrome BIN , @StringLeftLength Int ) RETURNS Binary AS BEGIN SET @ n=1 SET @StringLength= Len(String) WHILE @StringLength - @n >1 IF Left(String,@n)=Right(String, @StringLength) SET @n =n+1 SET @StringLength =StringLength -1 RETURN @Binary …

3
如何授予对表值函数的权限
我做对了吗...? 我有一个可以退款的功能... CREATE FUNCTION functionName( @a_principal money, @a_from_date datetime, @a_to_date datetime, @a_rate float ) RETURNS money AS BEGIN DECLARE @v_dint money set @v_dint = computation_here set @v_dint = round(@v_dint, 2) RETURN @v_dint END GO Grant execute on functionName to another_user Go 我只是想知道是否可以将其转换为iTVF? 我尝试这样做,但出现错误: CREATE FUNCTION functionName ( @a_principal money, @a_from_date …

3
在PostgreSQL中,是否存在类型安全的first()聚合函数?
完整问题重写 我在寻找First()聚合函数。 在这里,我发现了几乎可行的方法: CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement ) RETURNS anyelement LANGUAGE sql IMMUTABLE STRICT AS $$ SELECT $1; $$; -- And then wrap an aggregate around it CREATE AGGREGATE public.first ( sfunc = public.first_agg, basetype = anyelement, stype = anyelement ); 问题在于,当varchar(n)列通过first()函数时,它将转换为简单的varchar(无大小)。尝试以函数RETURNS SETOF anyelement的形式返回查询时,出现以下错误: 错误:查询的结构与函数结果类型不匹配Estado de …

1
SQL Server-处理嵌套的非确定性视图堆栈中的字符串本地化
在对数据库进行概要分析时,我遇到了一个视图,该视图引用了一些不确定性函数,对于该应用程序池中的每个连接,每分钟可访问1000-2500次。从视图中看,一个简单的代码将产生以下执行计划:SELECT 对于少于一千行的视图来说,这似乎是一个复杂的计划,每隔几个月可能会看到一两行发生变化。但是随着以下其他情况的恶化,情况变得更糟: 嵌套视图是不确定的,因此我们无法为其编制索引 每个视图都引用多个UDFs来构建字符串 每个UDF都包含嵌套UDF的,以获取本地化语言的ISO代码 堆栈中的视图使用从s 返回的其他字符串构建器UDF作为JOIN谓词 每个视图堆被视为一个表,这意味着有INSERT/ UPDATE/ DELETE在每个触发器来写入底层表 在视图上,这些触发器使用CURSORS该EXEC存储过程作为参考更多的这些串建设UDF秒。 这对我来说似乎很烂,但是我只有几年使用TSQL的经验。它也会变得更好! 看来开发人员认为这是个好主意,做了所有这些工作,以便所存储的几百个字符串可以基于从UDF特定于模式的a返回的字符串进行翻译。 这是堆栈中的视图之一,但是它们都同样糟糕: CREATE VIEW [UserWKStringI18N] AS SELECT b.WKType, b.WKIndex , CASE WHEN ISNULL(il.I18NID, N'') = N'' THEN id.I18NString ELSE il.I18nString END AS WKString ,CASE WHEN ISNULL(il.I18NID, N'') = N'' THEN id.IETFLangCode ELSE il.IETFLangCode END AS IETFLangCode ,dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, …

2
在功能/过程中进行DML操作后是否需要提交?
我想知道是否有必要在函数/过程中的插入/删除/更新之后写提交? 例: create or replace function test_fun return number is begin delete from a; return 0; end; 或程序 create or replace procedure aud_clear_pro as begin delete from a; end; 删除后需要提交吗? 无法了解以下情况: 如果我从SQL窗口调用函数/过程,则需要提交 但 如果我使用dbms_scheduler计划功能/过程并运行作业,则自动提交delete语句。 为什么?

1
这个语法如何运作?{fn CurDate()}或{fn Now()}等
最近,我一直在浏览一些为SQL Server 2005编写的相当老的存储过程,并且发现一些我不理解的东西。它似乎是某种类型的函数调用。 一个样品: SELECT o.name, o.type_desc, o.create_date FROM sys.objects o WHERE o.create_date < {fn Now()} -1; 这将显示所有行sys.objects有一个create_date前24小时前。 如果显示此查询的执行计划,{fn Now()}则会看到该计划已被getdate()数据库引擎替换: SELECT [o].[name],[o].[type_desc],[o].[create_date] FROM [sys].[objects] [o] WHERE [o].[create_date]<(getdate()-@1) 显然,使用{fn Now()}远比钝GetDate()。我会避免像瘟疫这样的语法,因为它没有记录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.