标签: functions

在 SQL Server 2012 中的 TSQL 函数中使用 XSD 验证 XML?

我需要在 TSQL 中使用 XSD 验证 XML。为了使此任务半自动化,我需要在 TSQL 函数中执行此操作。

为了进行验证,我必须将值设置为 XML,如果它无效,我将收到一个错误。

我的问题是在 TSQL 函数内部我不能使用TRY / CATCH. 这是正确的方式吗,如果有可能做到这一点?

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

5
推荐指数
1
解决办法
917
查看次数

即使已声明,在 SQL 函数中出现错误“必须声明标量变量”

我正在改变function

ALTER FUNCTION [dbo].[fn_CalculateListing](@Listing TypeListingDatePrice READONLY)
RETURNS TypePreviousListingResult 
AS 
BEGIN
    DECLARE @tbl_ListingDateDetails TypePreviousListingResult   
    RETURN @tbl_ListingDateDetails
END
GO
Run Code Online (Sandbox Code Playgroud)

但抛出错误为:

Msg 137, Level 16, State 1, Procedure fn_CalculateListing, Line 6
Must declare the scalar variable "@tbl_ListingDateDetails".
Run Code Online (Sandbox Code Playgroud)

即使我在使用该变量之前已经声明过,为什么会出现错误并要求声明?

TypePreviousListingResult 是创建为 的表类型CREATE TYPE TypePreviousListingResult AS TABLE...

上一个问题:如何在sql中编写接受表作为输入并将结果作为表返回的函数?

sql-server sql-server-2012 functions user-defined-table-type table-valued-parameters

5
推荐指数
1
解决办法
8513
查看次数

使用复合类型的数组作为函数参数并访问它

Books在 Postgres 中创建了一个类型,它有 2 个numeric字段和 2 个varchar字段。我想将Books一个函数的数组发送到INSERT匹配表中的那些值。

这是我的类型:

CREATE TYPE Books AS (
V_Book_ID NUMERIC,
V_Row_Num NUMERIC,
V_Book_OWNER TEXT,
V_Book_OWNER_ID TEXT
);
Run Code Online (Sandbox Code Playgroud)

这是我的功能:

CREATE OR REPLACE FUNCTION Update_Table(row_book Books[]) RETURNS TEXT AS $$
DECLARE
   Status TEXT;
   I_Max integer := array_length(row_book, 1);
BEGIN
FOR I in 1..I_Max
  LOOP
   INSERT INTO books_table(Book_ID,
   Row_Num,
   Book_OWNER,
   Book_OWNER_ID)
   values
   (row_book[I].V_Book_ID,
   row_book[I].V_Row_Num,
   row_book[I].V_Book_OWNER,
   row_book[I].V_Book_OWNER_ID);
END LOOP;

   STATUS:='Saved';
exception when others then
   STATUS:='failure';
   RETURN STATUS;

END;
$$ …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql functions array composite-types

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

在链接服务器上运行内置函数

我们有两台 SQL 2014 服务器,我在其中一台上创建了一个链接服务器到另一台上。作为我尝试运行的任务的一部分,我需要将 SQL 用户 ID 转换为本地和链接服务器上的用户名。

在本地服务器上,我可以调用

SELECT SUSER_NAME(1)
Run Code Online (Sandbox Code Playgroud)

这将返回字符串 sa

是否有一种简单的方法可以SUSER_NAME在链接服务器上运行该函数以从那里获取值?

我认为我发现的另一种选择是加入sys.server_principals并从那里拉出名称,但SUSER_NAME似乎是一种更清洁的方法。

sql-server linked-server functions sql-server-2014

5
推荐指数
1
解决办法
1309
查看次数

Postgres - 仅尝试备份函数

我正在尝试按照 Craig Ringer 对这个问题的回答:https :
//stackoverflow.com/questions/13758003/how-to-take-backup-of-functions-only-in-postgres

我的命令是:

psql -U username -AT db_name -c "
    SELECT pg_get_functiondef(f.oid) 
    FROM pg_catalog.pg_proc f 
    INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid) 
    WHERE n.nspname = 'public'
" > /dump/file/functions.sql
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

Error: "st_extent" is an aggregate function
Run Code Online (Sandbox Code Playgroud)

为什么它不喜欢聚合函数?我该怎么做才能解决这个问题?

postgresql backup aggregate functions

5
推荐指数
1
解决办法
2633
查看次数

Microsoft SQL Server 创建内联函数

我对 SQL 完全陌生,我必须编写一个用户定义的函数 (UDF) 来计算给定时间范围内学生的 GPA。这些输入StudentId intClassStartDateStart datetime以及ClassStartDateEnd datetime。其中输出应该是学生在ClassStartDateStart 和之间参加的所有课程的 GPA ClassStartDateEnd。此外,提供调用此新函数的脚本,将您选择的参数值传递给它。我尝试创建一个代码,但不知道从哪里开始。这是我到目前为止所拥有的:

USE [Master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION GPAofStudents 
  (StudentID int, 
   ClassStartDateStart datetime, 
   ClassStartDateEnd datetime)
  RETURNS decimal(3,2) 
  AS
BEGIN 
DECLARE AvgGPA decimal(5,2); 
SET AvgGPA = (SELECT AVG(Class_GPA)
FROM Students_Classes 
  WHERE Student_ID = StudentID 
    AND Start_Date > ClassStartDateStart 
    AND Start_Date <= ClassStartDateEnd 
    AND Class_GPA > 0; 
    RETURN AvgGPA; 
END;
Run Code Online (Sandbox Code Playgroud)

我给学生的桌子是这样的:

CREATE TABLE [dbo].[Students_Classes](
    [Student_Class_ID] [int] …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql functions

5
推荐指数
1
解决办法
4387
查看次数

获取视图中使用的函数列表

假设我有一个这样的函数:

create function house_analysis(ingeo geometry)
  returns table(count_all numeric, count_important numeric) as
$$
  select count(*), count(*) filter (where h.import_flag)
  from house_table h where st_intersects(ingeo, h.geom)
$$ language sql stable;
Run Code Online (Sandbox Code Playgroud)

我定义了一个这样的视图:

create or replace view postzone_analysis as (
  select p.zipcode, ha.count_all, ha.count_important
  from postzone_table p, house_analysis(p.geom) ha
);
Run Code Online (Sandbox Code Playgroud)

问题是:

如何pg_catalog.*使用我的视图(postzone_analysis或其视图)查询系统目录 ( ) 以oid获取其中使用的函数的列表?他们的pg_proc.oid价值观很好。

我知道数据库会跟踪,因为我无法删除该函数,但在pg_depend.

数据库是 PostgreSQL 9.5。

(现实生活中的情况要复杂得多 - 它被缩小为最低可行的例子。视图调用就像 6 个分析函数,它结合了来自不同来源的数据,并且有多个基于不同区域类的视图。 )

postgresql view functions dependencies

5
推荐指数
1
解决办法
1336
查看次数

TIME 函数在 5.5 和 5.6 之间变化

我面临一个问题,当从 MySQL 5.5.46 迁移到 MySQL 5.6.34 时,我无法使用 TIME 函数获得相同的结果。问题是,当我在 5.5 中使用 TIME 函数时,它在 datetime 为“0000-00-00 00:00:00”时返回 NULL,但前提是它是来自表的值,但使用 5.6 我得到'00:00:00'。这听起来不错,但是有许多查询依赖于 5.5 的行为(结果为 NULL)。这是我为准确测试该行为所做的示例:

一、表:

CREATE TABLE `prueba_time` (
  `check_in` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

然后我插入一行值为 0000-00-00 00:00:00

mysql> INSERT INTO prueba_time VALUES ('0000-00-00 00:00:00');
Run Code Online (Sandbox Code Playgroud)

然后我测试了TIME函数……5.5中的结果是:

mysql> SELECT TIME(check_in),check_in,TIME('0000-00-00 00:00:00') FROM prueba_time;
+----------------+---------------------+-----------------------------+
| TIME(check_in) | check_in            | TIME('0000-00-00 00:00:00') |
+----------------+---------------------+-----------------------------+
| NULL           | 0000-00-00 00:00:00 | 00:00:00                    |
+----------------+---------------------+-----------------------------+
Run Code Online (Sandbox Code Playgroud)

和 5.6 中的相同查询:

mysql> SELECT TIME(check_in),check_in,TIME('0000-00-00 00:00:00') FROM prueba_time; …
Run Code Online (Sandbox Code Playgroud)

mysql mysql-5.5 functions mysql-5.6

5
推荐指数
1
解决办法
288
查看次数

Postgres 函数索引不能与正则表达式一起正常工作

我有这个 Postgres 功能。它强制文本为小写,所有空值变为空字符串,以便我更干净地执行搜索不匹配的内容等:

CREATE OR REPLACE FUNCTION magic_text(txt text) RETURNS text
IMMUTABLE PARALLEL SAFE
LANGUAGE SQL AS $$
  SELECT lower(coalesce(txt,''))
$$;
Run Code Online (Sandbox Code Playgroud)

这个函数在许多不同的查询类型中被大量使用,所以我为它创建了所有种类的文本索引:

CREATE INDEX index_magic_cards_on_oracle_text_magic 
ON magic_cards 
USING BTREE (magic_text(oracle_text)) WITH (fillfactor = 100);

CREATE INDEX index_magic_cards_on_oracle_text_magic_text_pattern 
ON magic_cards 
USING BTREE (magic_text(oracle_text) text_pattern_ops) WITH (fillfactor = 100);

CREATE INDEX index_magic_cards_on_oracle_text_magic_gist_trgm 
ON magic_cards 
USING GIST (magic_text(oracle_text) gist_trgm_ops);

CREATE INDEX index_magic_cards_on_oracle_text_magic_gin_trgm 
ON magic_cards 
USING GIN (magic_text(oracle_text) gin_trgm_ops)
Run Code Online (Sandbox Code Playgroud)

这些索引以某种方式干扰了某些(但不是全部)类型的复杂正则表达式搜索。我无法确定特定的正则表达式符号或功能是否会导致问题。

这是一个示例(explain.depesz):

SELECT card_name 
FROM magic_cards 
WHERE magic_text(oracle_text) ~ '***:(?n)eldrazi\ (?!scion)';
Run Code Online (Sandbox Code Playgroud)

这不返回任何内容,并且根据查询规划器,它会在 上执行位图索引扫描 …

postgresql index regular-expression functions

5
推荐指数
1
解决办法
567
查看次数

未存储标量函数值

我创建了一个标量值函数,它在传入的秒数中暂停。这个函数不会在生产中使用。如果我向查询添加 UDF,我正在尝试测试 SQL Server 如何评估和创建计划。我对它如何评估我的 3 个查询中的最后一个的差异感到非常困惑。首先是创建测试函数的代码:

CREATE FUNCTION dbo.[sleep](@seconds int)
RETURNS datetime
as
BEGIN

DECLARE @sleepUntil datetime
DECLARE @dummy int
SET @sleepUntil = DATEADD(s, @seconds, getdate())
WHILE getdate() < @sleepUntil
    SET @dummy = 0
RETURN getdate()
END
Run Code Online (Sandbox Code Playgroud)

现在创建一个表来测试查询

CREATE TABLE #table (num int)
Run Code Online (Sandbox Code Playgroud)

并插入值

INSERT INTO #table 
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)
Run Code Online (Sandbox Code Playgroud)

第一个查询需要 2 秒才能运行 - 假设 SQL Server 存储从标量函数返回的值,这是有道理的。

   SELECT num
   FROM #table t
   WHERE dbo.sleep(2)=0 
Run Code Online (Sandbox Code Playgroud)

第二个仍然需要 2 秒 - 所以我的假设是它也一样。

 SELECT num
   FROM #table t
   WHERE EXISTS (select TOP 1 …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization functions

5
推荐指数
1
解决办法
801
查看次数