我刚刚创建了一个 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) 我还没有决定数据库。我对 MySQl 有经验,并且对MongoDB很感兴趣。
让产品成为有线电视提供商的套餐:
{
name: "Virgin TV",
price: 20
},
{
name: "Sky",
price: 25
}
Run Code Online (Sandbox Code Playgroud)
每个包裹都有一些条件。的天空包例如可以是:
但Virgin 套餐的条件会有所不同。
我只能想到为每个不同的条件创建类似存储过程的东西?
如果我不必标准化所有条件以适应数据库模式,那就太好了,因为新条件很容易来来去去。
编辑: 我已经意识到 2 个要点
现在,我们的 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) 有没有办法阻止开发人员创建使用游标的新用户定义函数?可以读取UDF代码的数据库触发器可以吗?
我维护一个使用 PostgreSQL 数据库的遗留应用程序。
该应用程序严重依赖于存储过程(又名函数)。
我想将这些函数保存到以函数名命名的文件中,以便我可以使用 VCS(版本控制系统)。
我知道我可以ALTER FUNCTION使用 using保存代码,PgAdmin但这一次只允许我保存一个函数。
我正在寻找一种自动保存所有功能的方法。有没有办法编写此任务的脚本?
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 的行为。
那么是否有一些技术可以创建一个我没有看到的简单包装器?或者我将不得不做更多的工作?
我有一个存储过程,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) 我问了一个关于XML使用XSD schemainside验证的问题SQL Server 2012(见链接)。我明白(正如我怀疑的那样)我需要使用CLR Function. 该函数将获取XSD schema text并XML text进行验证。
我将有 1 个配置数据库和许多安装数据库。从那个角度来看,我想知道在哪里创建该功能 - 在配置数据库中还是在每个安装数据库中?
从支持的角度来看,最好只有一个 CLR 功能。
这里有没有人在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) 我们正在为客户管理抽奖活动,其中我们有一个与参赛者和参赛者获得的参赛作品数量相关联的 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 是条目的总数。但是,当然,如果有一种方法可以轻松地以编程方式选择获胜者,我会全神贯注(或视情况而定)。
提前致谢。
我想生成给定日期的通用季度结束日期。
例如:如果我有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。
有没有更好的办法?