标签: functions

为什么我不能直接调用我的 UDF?为什么我需要将它限定为 3 个级别?

我刚刚创建了一个 UDF 并对其进行了测试,我发现只有在使用此语法时才有效

SELECT [PMIS].[dbo].[fnIsReportingTo] (50,1132)
Run Code Online (Sandbox Code Playgroud)

我期待它像这样工作:

select * from fnIsReportingTo (50,1132)
Run Code Online (Sandbox Code Playgroud)

或者

select fnIsReportingTo (50,1132)
Run Code Online (Sandbox Code Playgroud)

这是我的创建 SQL:

create function fnIsReportingTo
(
@BossID int,
@EmployeeID int)
RETURNs bit
AS
begin
declare @ret bit
    if exists (select * from dbo.fnGetEmployeeHierarchy(@BossID) where employeeID=@employeeID)
        select @ret=1
    else
        select @ret=0
return @ret
end
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server syntax functions

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

如何存储和查询价格取决于一组复杂条件的产品?

我还没有决定数据库。我对 MySQl 有经验,并且对MongoDB很感兴趣。

让产品成为有线电视提供商的套餐:

{
    name: "Virgin TV",
    price: 20
},
{

    name: "Sky",
    price: 25
}
Run Code Online (Sandbox Code Playgroud)

每个包裹都有一些条件。的天空包例如可以是:

  • 前三个月的价格是XXX然后变成YYY
  • 如果您在 00:00 之后看电视是XXX-10
  • 如果您是第 N 个客户,您将享有 10% 的折扣。
  • ...

但Virgin 套餐的条件会有所不同

1) 我如何实际存储产品及其所有条件?

我只能想到为每个不同的条件创建类似存储过程的东西?

如果我不必标准化所有条件以适应数据库模式,那就太好了,因为新条件很容易来来去去。

编辑: 我已经意识到 2 个要点

  • MongoDB 支持匿名函数作为字段的值。
  • Map/Reduce 可以使用函数将一个集合转换为另一个集合

现在,我们的 Sky 包装及其状况可以轻松存储:

db.packages.insert({
    name:      "Sky"
    price:     25,
    condition: function(object, user_input){
        time_discount = user_input.time > 0 and user_input.time < 6 ? 10 : 0; …
Run Code Online (Sandbox Code Playgroud)

mongodb database-design query functions

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

禁止包含游标的新 UDF

有没有办法阻止开发人员创建使用游标的新用户定义函数?可以读取UDF代码的数据库触发器可以吗?

sql-server-2008 sql-server ddl functions

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

如何将函数保存到 PostgreSQL 中的单个文件?

我维护一个使用 PostgreSQL 数据库的遗留应用程序。

该应用程序严重依赖于存储过程(又名函数)。

我想将这些函数保存到以函数名命名的文件中,以便我可以使用 VCS(版本控制系统)。

我知道我可以ALTER FUNCTION使用 using保存代码,PgAdmin但这一次只允许我保存一个函数。

我正在寻找一种自动保存所有功能的方法。有没有办法编写此任务的脚本?

postgresql backup version-control functions postgresql-9.1

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

是否可以在 Postgres 中包装聚合函数?

Postgres 的 string_agg(expr, delimiter) 函数很棒。但我想要一个版本,它接受一个参数——要聚合的字段——并假设分隔符为 ', ' 因为这是我想要的 10 次中的 9 次。使用非聚合函数,我可以只需这样做:

create or replace function public.string_agg(text)
returns text
as $$
    select string_agg($1, ', ');
$$ language sql
immutable;
Run Code Online (Sandbox Code Playgroud)

但由于 string_agg 是一个聚合函数,这不起作用。它抱怨我传递给它的字段需要在 GROUP BY 子句中,这告诉我查询引擎不知道我的包装器是一个聚合函数。

我查看了用户定义聚合的文档(http://www.postgresql.org/docs/9.1/static/xaggr.html 和http://www.postgresql.org/docs/9.1/static/sql-createaggregate .html ) 但我不清楚如何使用现有的 string_agg(text, text) 定义我的新 string_agg(text)。看来我必须从头开始定义我的新函数,这比我想承担的要复杂得多,而且我也不完全有信心我可以完美地反映内置 string_agg 的行为。

那么是否有一些技术可以创建一个我没有看到的简单包装器?或者我将不得不做更多的工作?

postgresql aggregate functions

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

PostgreSQL 存储过程返回行或空集

我有一个存储过程,RETURNS SETOF ct_custom_type我在里面做

RETURN QUERY EXECUTE 'some dynamic query'
Run Code Online (Sandbox Code Playgroud)

我想这样做:如果这个“动态查询”返回 >= 10 行,我想返回它们,但如果它只返回 < 10 行,我不想返回任何东西(空集ct_custom_type)。

我试过:

RETURN QUERY EXECUTE 'some dynamic query'

GET DIAGNOSTICS variable = ROW_COUNT;
IF variable < 10 THEN

    # I don't know what to do here or how to accomplish this

END IF;
Run Code Online (Sandbox Code Playgroud)

如果我RETURN QUERY SELECT 0, 0, ''::text;IF块中执行(因为ct_custom_type是 的复合类型(integer, integer, text),它只是将这个“空行”添加到先前的查询结果中,但在这种情况下我不想返回任何内容,我可以这样做RETURN;,但它会返回先前的结果,我想丢弃它。

我有这样的:

EXECUTE 'dynamic query';

GET DIAGNOSTICS variable = ROW_COUNT; …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql functions

7
推荐指数
2
解决办法
3万
查看次数

如何从性能的角度更好地使用 CLR 函数(在每个 DB 内部重复或具有通用功能)?

我问了一个关于XML使用XSD schemainside验证的问题SQL Server 2012(见链接)。我明白(正如我怀疑的那样)我需要使用CLR Function. 该函数将获取XSD schema textXML text进行验证。

我将有 1 个配置数据库和许多安装数据库。从那个角度来看,我想知道在哪里创建该功能 - 在配置数据库中还是在每个安装数据库中?

从支持的角度来看,最好只有一个 CLR 功能。

xml t-sql sql-server-2012 functions sql-clr

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

Azure 数据仓库 - 用户定义的函数问题

这里有没有人在Azure 数据仓库数据库上创建和使用 UDF 很幸运?我正在将本地仓库从 SQL Server 2014 迁移到 Azure 数据仓库,但遇到了 UDF 问题。

CREATE FUNCTION dbo.fn_GetImpliedRate (@Multiple float, @term int)
RETURNS float
AS
BEGIN
    DECLARE @ImpInt float
    IF(@Term = 1)
        SET @ImpInt = (select [1] from  dbo.ImpliedRate where Multiple = @Multiple); 
    IF(@Term = 2)
        SET @ImpInt = (select [2] from  dbo.ImpliedRate where Multiple = @Multiple); 
    IF(@Term = 3)
        SET @ImpInt = (select [3] from  dbo.ImpliedRate where Multiple = @Multiple); 
    IF(@Term = 4)
        SET @ImpInt = (select [4] from  dbo.ImpliedRate …
Run Code Online (Sandbox Code Playgroud)

sql-server etl functions azure-sql-data-warehouse

7
推荐指数
2
解决办法
5021
查看次数

根据列值返回行数

我们正在为客户管理抽奖活动,其中我们有一个与参赛者和参赛者获得的参赛作品数量相关联的 GUID。我希望能够根据与参赛人数相对应的获胜机会来抽取获胜者。

GUID | Entries
--------------
1    | 1
2    | 5
3    | 2
4    | 7
Run Code Online (Sandbox Code Playgroud)

所以结果将是:

GUID
----
1
2
2
2
2
2
3
3
4
4
4
4
4
4
4
Run Code Online (Sandbox Code Playgroud)

基本上我计划将结果放在电子表格中,然后使用随机数生成器在 1 和 n 之间选择一个行号,其中 n 是条目的总数。但是,当然,如果有一种方法可以轻松地以编程方式选择获胜者,我会全神贯注(或视情况而定)。

提前致谢。

stored-procedures functions

7
推荐指数
2
解决办法
3072
查看次数

季度的通用结束日期,PostgreSQL

我想生成给定日期的通用季度结束日期。

例如:如果我有2010-01-01,我想返回2010-03-31,等等。

我可以得到季度号和年份:

select to_char(date_trunc('quarter',  current_date)::date, 'yyyy-q');
Run Code Online (Sandbox Code Playgroud)

2017-3从今天起返回的是2017-07-14

我如何很好地获得季度结束日期?

我可以得到答案,但它非常丑陋:

select to_char(date_trunc('year',  date '2015-01-01'),'yyyy') || '-' ||case
    when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 1 then '03-31'
    when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 2 then '06-30'
    when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 3 then '09-30'
    when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 4 then '12-31'
    else '?'
    end 
Run Code Online (Sandbox Code Playgroud)

返回2015-03-31因为我把2015-01-01

有没有更好的办法?

postgresql functions date interval

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