Questions tagged «functions»

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

1
EXPLAIN ANALYZE不显示plpgsql函数内部查询的详细信息
我在PostgreSQL 9.3中使用PL / pgSQL函数,内部有几个复杂的查询: create function f1() returns integer as $$ declare event tablename%ROWTYPE; .... .... begin FOR event IN SELECT * FROM tablename WHERE condition LOOP EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return; END LOOP; ... INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ... UPDATE …

3
NVL代表什么?
代表什么NVL?我说的是Oracle和Informix(也许还有其他)函数,用于从查询结果中过滤出非NULL值(类似于COALESCE其他数据库)。

2
在功能/存储过程创建时禁用架构检查
我正在尝试自动化对SQL Server 2008 R2数据库执行更改的过程。我放置的过程会删除并重新创建我的存储过程和函数,以及运行脚本来更改表/列/数据。不幸的是,其中一个脚本需要首先放置其中一个功能。但是我不能先运行所有存储的proc / function更改,因为它首先依赖于从表/列/数据更改脚本中添加的列。 我想知道是否可以在不通过SQL Server验证函数/ SP定义中使用的列的情况下运行存储过程和函数?我尝试查找,但找不到条件或命令来启用此功能。

4
PostgreSQL 9.6列删除和带有CTE的SQL函数的副作用
如果我有一个包含3列的表(例如A,B和D),并且我不得不引入一个新表(例如C)来替换D的当前位置。我将使用以下方法: 引入2个新列作为C和D2。 将D的内容复制到D2。 删除D。 将D2重命名为D。 新订单将为A,B,C和D。 我认为这是合法的做法,因为(到目前为止)它没有产生任何问题。 但是,今天,当在同一张表上执行语句的函数返回以下错误时,我遇到了一个问题: table row type and query-specified row type do not match 以及以下详细信息: Query provides a value for a dropped column at ordinal position 13 我尝试重新启动PostgreSQL,执行a VACUUM FULL,最后按照此处和此处的建议删除并重新创建该函数,但是这些解决方案均无效(除了它们尝试解决系统表已更改的情况外)。 由于可以使用非常小的数据库,因此我将其导出,删除并重新导入,从而解决了我的功能问题。 我知道这样一个事实,即不应该通过修改系统表来弄乱列的自然顺序(用弄脏手pg_attribute等),如下所示: 是否可以更改Postgres中列的自然顺序? 从我的函数抛出的错误来看,我现在意识到用我的方法移动列的顺序也是不行的。谁能为我的工作为什么也出错提供一些启发? Postgres版本是9.6.0。 这是函数: CREATE OR REPLACE FUNCTION "public"."__post_users" ("facebookid" text, "useremail" text, "username" …

2
为什么标量值函数需要执行权限而不是选择权限?
我想知道为什么对于标量值函数,我必须授予用户执行权而不仅仅是选择权? 同时,表值函数仅在具有选择权限或db_datareader成员资格的情况下才能正常工作。 为了更清楚,这里是我的示例:我需要一个对数据库具有只读权限的用户。所以我创建了一个名为的用户,testUser并为其指定了db_datareader成员资格。然后我创建了一个名为的表值函数fn_InlineTable。一切都很棒。testUser全天运行此SQL select * from dbo.fn_InlineTable 然后我需要一个标量函数,所以我创建了一个叫做的标量函数fn_ScalarTest。 testUser无法运行此SQL Select dbo.fn_ScalarTest(1) 可以理解的是:这是因为我没有授予“ testUser”执行权限fn_ScalarTest。 我的问题是:基于此链接/programming/6150888/insert-update-delete-with-function-in-sql-server,说FUNCTION不能使用a来执行修改数据库状态的操作。那么,为什么不让标量函数与相同的“ SELECT”权限一起使用,而不是执行权限呢? 我希望我的问题有道理。谢谢。

3
通过代码创建新函数(如果不存在)
我想通过脚本在数据库中创建新功能。脚本代码如下: IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return; CREATE FUNCTION fn_myfunc () returns varchar(10) AS Begin ... End 但是当我执行上述脚本时,SQL Server返回错误: 'CREATE FUNCTION' must be the first statement in a query batch.

1
如何在PostgreSQL中使用AES加密?
我通过使用以下语句尝试了aes-encryption: SELECT encrypt('test', 'key', 'aes'); 哪个有效,但我无法解密该值。我将它插入了一个数据类型bytea的字段中,但是我不确定这是否正确。 SELECT decrypt(pw, 'key', 'aes') FROM table WHERE ID = 1; 给我错误 错误:函数delete(bytea,未知,未知)不存在第 1行:从Tabelle WHERE ID = 7;中选择解密(pw,'key','aes');^ 提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。 这是否真的意味着crypto()是现有函数,而不是crypto()?我还能如何检索aes加密的值?


2
如何实现基于集合的算法/ UDF
我有一个算法,需要对具有800K行和38列的表中的每一行运行。该算法在VBA中实现,并且使用来自某些列的值来操纵其他列来进行一堆数学运算。 我目前正在使用Excel(ADO)来查询SQL,并将VBA与客户端游标一起使用来逐行循环应用该算法。它可以工作,但是需要7个小时才能运行。 VBA代码非常复杂,以至于将其重新编码为T-SQL会花费很多工作。 我已经阅读了有关CLR集成和UDF作为可能路线的信息。我还考虑过将VBA代码放在SSIS脚本任务中,以使其更接近数据库,但可以肯定存在解决此类性能问题的专家方法。 理想情况下,我将能够以基于并行集的方式针对尽可能多的行(所有?)运行算法。 任何帮助都很大程度上取决于如何在此类问题上获得最佳性能。 - 编辑 感谢您的评论,我正在使用MS SQL 2014 Enterprise,这里有更多详细信息: 该算法在时间序列数据中找到特征模式。该算法中的函数执行多项式平滑,加窗,并根据输入标准查找感兴趣的区域,返回十二个值和一些布尔结果。 我的问题更多是关于方法的问题,而不是实际的算法:如果我想一次在多个行上实现并行计算,我有什么选择。 我看到建议重新编码为T-SQL,这是很多工作,但是可能的,但是算法开发人员在VBA中工作,并且更改频繁,因此我需要与T-SQL版本保持同步并重新验证每个更改。 T-SQL是实现基于集合的函数的唯一方法吗?


1
如何从SQL Server审核数据中筛选出标量值用户定义的函数用法?
我们有一个SQL Server数据库,该数据库具有数据库审核规范,该规范审核数据库上所有执行的操作。 CREATE DATABASE AUDIT SPECIFICATION [dbAudit] FOR SERVER AUDIT [servAudit] ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public]) 我们发现,某些查询将对结果集中的每一行使用标量函数写入审核日志。当发生这种情况时,在将日志ETL放入最终的静止位置之前,日志已填满,并且日志记录中存在空白。 不幸的是,由于合规性原因,我们不能简单地停止审核每条EXECUTE声明。 解决此问题的方法首先想到的是使用WHERE“ 服务器审核”上的子句来过滤活动。代码如下所示: WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' ) 不幸的是,SQL Server不允许使用关系IN运算符(可能是因为它不想在每次必须写入审核日志时都进行查询)。 我们想避免编写一个存储过程,其硬代码object_id中WHERE条款,但是这是我们在解决这个问题的最好办法目前的想法。我们是否应该考虑替代方法? 我们注意到,当在递归CTE中使用标量函数时,它将导致查询将查询写入结果集中的每一行。 供应商提供了一些标量值函数,我们无法删除或移动到备用数据库。

3
模拟用户定义的标量函数,其方式不会阻止并行性
我正在尝试查看是否存在一种诱使SQL Server对查询使用特定计划的方法。 1.环境 假设您有一些在不同进程之间共享的数据。因此,假设我们有一些实验结果需要很多空间。然后,对于每个过程,我们都知道要使用哪个年/月的实验结果。 if object_id('dbo.SharedData') is not null drop table SharedData create table dbo.SharedData ( experiment_year int, experiment_month int, rn int, calculated_number int, primary key (experiment_year, experiment_month, rn) ) go 现在,对于每个过程,我们都在表中保存了参数 if object_id('dbo.Params') is not null drop table dbo.Params create table dbo.Params ( session_id int, experiment_year int, experiment_month int, …

1
如何强制在一个查询中仅对一次标量UDF求值?
我有一个查询,需要根据标量UDF的结果进行过滤。该查询必须作为单个语句发送(因此我不能将UDF结果分配给局部变量),并且不能使用TVF。我知道由标量UDF引起的性能问题,其中包括强制整个计划以串行方式运行,过多的内存授予,基数估计问题以及缺少内联。对于这个问题,请假设我需要使用标量UDF。 UDF本身的调用成本非常高,但是从理论上讲,查询可以由优化器以合理的方式实现,使得函数只需要计算一次即可。我为这个问题模拟了一个大大简化的例子。以下查询需要6152毫秒才能在我的计算机上执行: SELECT x1.ID FROM dbo.X_100_INTEGERS x1 WHERE x1.ID >= dbo.EXPENSIVE_UDF(); 查询计划中的过滤器运算符建议针对每行对该函数进行一次评估: DDL和数据准备: CREATE OR ALTER FUNCTION dbo.EXPENSIVE_UDF () RETURNS INT AS BEGIN DECLARE @tbl TABLE (VAL VARCHAR(5)); -- make the function expensive to call INSERT INTO @tbl SELECT [VALUE] FROM STRING_SPLIT(REPLICATE(CAST('Z ' AS VARCHAR(MAX)), 20000), ' '); RETURN 1; …

3
计算系列中每个日期覆盖多少日期范围的最快方法
我有一个表(在PostgreSQL 9.4中)看起来像这样: CREATE TABLE dates_ranges (kind int, start_date date, end_date date); INSERT INTO dates_ranges VALUES (1, '2018-01-01', '2018-01-31'), (1, '2018-01-01', '2018-01-05'), (1, '2018-01-03', '2018-01-06'), (2, '2018-01-01', '2018-01-01'), (2, '2018-01-01', '2018-01-02'), (3, '2018-01-02', '2018-01-08'), (3, '2018-01-05', '2018-01-10'); 现在,我想为给定的日期和每种类型计算dates_ranges每个日期落入多少行。零可能会省略。 所需结果: +-------+------------+----+ | kind | as_of_date | n | +-------+------------+----+ | 1 | …

2
有副作用的标准SQL函数吗?
SQL标准是否定义了具有副作用的函数? 例如,当您执行以下操作时,它们是否具有用于写入文件 *或更新表中某些列中的值的功能? SELECT myfunction(params...); 我有时见过这些,但是我很好奇SQL标准是否也这样做。 *这不是专门针对PostgreSQL的问题。我仅使用在PostgreSQL中看到的副作用示例。

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.