我需要在 TSQL 中使用 XSD 验证 XML。为了使此任务半自动化,我需要在 TSQL 函数中执行此操作。
为了进行验证,我必须将值设置为 XML,如果它无效,我将收到一个错误。
我的问题是在 TSQL 函数内部我不能使用TRY / CATCH. 这是正确的方式吗,如果有可能做到这一点?
我正在改变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-server sql-server-2012 functions user-defined-table-type table-valued-parameters
我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) 我们有两台 SQL 2014 服务器,我在其中一台上创建了一个链接服务器到另一台上。作为我尝试运行的任务的一部分,我需要将 SQL 用户 ID 转换为本地和链接服务器上的用户名。
在本地服务器上,我可以调用
SELECT SUSER_NAME(1)
Run Code Online (Sandbox Code Playgroud)
这将返回字符串 sa
是否有一种简单的方法可以SUSER_NAME在链接服务器上运行该函数以从那里获取值?
我认为我发现的另一种选择是加入sys.server_principals并从那里拉出名称,但SUSER_NAME似乎是一种更清洁的方法。
我正在尝试按照 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)
但我收到以下错误:
Run Code Online (Sandbox Code Playgroud)Error: "st_extent" is an aggregate function
为什么它不喜欢聚合函数?我该怎么做才能解决这个问题?
我对 SQL 完全陌生,我必须编写一个用户定义的函数 (UDF) 来计算给定时间范围内学生的 GPA。这些输入StudentId int,ClassStartDateStart 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) 假设我有一个这样的函数:
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 个分析函数,它结合了来自不同来源的数据,并且有多个基于不同区域类的视图。 )
我面临一个问题,当从 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) 我有这个 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)
这不返回任何内容,并且根据查询规划器,它会在 上执行位图索引扫描 …
我创建了一个标量值函数,它在传入的秒数中暂停。这个函数不会在生产中使用。如果我向查询添加 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) functions ×10
postgresql ×4
sql-server ×4
t-sql ×2
aggregate ×1
array ×1
backup ×1
dependencies ×1
index ×1
mysql ×1
mysql-5.5 ×1
mysql-5.6 ×1
optimization ×1
plpgsql ×1
sql-clr ×1
view ×1
xml ×1