我的一位开发人员编写了一个类似于 VB.Net 函数 (LastIndexOf) 的 SQL 函数,并希望发布它。我的问题是将它放在中央数据库中而不是将它放在每个用户数据库中的原因是什么?
开发人员试图将它放在他的主数据库上的 sys 模式中,这样他就不必限定从用户数据库对它的调用......叹气
但我不确定将它(显然不是主数据库)与每个用户数据库集中起来的有效借口是什么?
有没有办法编写一个插入/更新查询来检查列是否允许NULLs:如果它确实将列设置为NULL,''否则(空字符串)?
我会是这样的:
UPDATE mytable
SET field = IF(A_FUNCTION_TO_CHECK_IF_ALLOWS_NULL(), NULL, '');
Run Code Online (Sandbox Code Playgroud) 我有一张桌子叫书
CREATE TABLE book
(
id smallint NOT NULL DEFAULT 0,
bname text,
btype text,
bprices numeric(11,2)[],
CONSTRAINT key PRIMARY KEY (id )
)
Run Code Online (Sandbox Code Playgroud)
和一个函数 save_book
CREATE OR REPLACE FUNCTION save_book(thebook book)
RETURNS text AS
$BODY$
DECLARE
myoutput text :='Nothing has occured';
BEGIN
update book set
bname=thebook.bname,
btype=thebook.btype,bprices=thebook.bprices WHERE id=thebook.id;
IF FOUND THEN
myoutput:= 'Record with PK[' || thebook.id || '] successfully updated';
RETURN myoutput;
END IF;
BEGIN
INSERT INTO book values(thebook.id,thebook.bname,thebook.btype,
thebook.bprices);
myoutput:= 'Record successfully added';
END;
RETURN myoutput; …Run Code Online (Sandbox Code Playgroud) 是否有可能以某种方式定义全局可用的例程?似乎每个例程都必须在数据库范围内创建。
当我尝试从控制台创建一个例程(没有事先发布use dbname)时,我收到一个错误:
ERROR 1046 (3D000): No database selected
我们有大量相同的数据库(数据不同),目标是为某些表名创建一些触发器。但是我们只想运行一个例程,所以我们不必为每个数据库创建这些例程(因为它们是相同的,例程对每个数据库的工作方式相同)。
专有代码(我们无法更改)有一堆用户定义的函数类型:
create or replace function f() returns record as $$ ... $$
Run Code Online (Sandbox Code Playgroud)
我们通过以下方式调用它(例如):
SELECT status, log FROM f() as (status boolean, log text);
Run Code Online (Sandbox Code Playgroud)
(status boolean, log text)是 table 的行类型T。是否可以在不列出属性的情况下自动将record(或setof record返回类型)转换为T行类型?我正在寻找的是那种:
SELECT * FROM f() as T%rowtype
Run Code Online (Sandbox Code Playgroud) postgresql type-conversion plpgsql functions composite-types
这一直困扰着我。基于 SQL 的服务器中的字符串函数似乎总是从位置 1 开始(至少 MySQL、SQL Server、Oracle 和 Postgres 是这种情况)。例如,以下查询将用于选择名称数据库中名为 first_name 的列的第一个字母:
SELECT SUBSTRING(first_name,1,1) FROM names;
Run Code Online (Sandbox Code Playgroud)
为什么字符串函数的位置不像几乎所有编程语言的规范那样从 0 开始?
我正在寻找的不仅仅是 ANSI 标准。为什么是标准?
编辑:好的,所以 0 不是“几乎所有编程语言中的规范”,正如下面所指出的。1 也被使用。
这是一个数据库内部问题。我正在使用 PostgreSQL 9.5,我想知道为什么设置返回函数 (SRF),也称为表值函数 (TVF) 在FROM子句中运行得更慢,例如当我执行这些命令时,
CREATE TABLE foo AS SELECT * FROM generate_series(1,1e7);
SELECT 10000000
Time: 5573.574 ms
Run Code Online (Sandbox Code Playgroud)
它总是比,慢得多
CREATE TABLE foo AS SELECT generate_series(1,1e7);
SELECT 10000000
Time: 4622.567 ms
Run Code Online (Sandbox Code Playgroud)
是否有一个通用规则可以在这里制定,以便我们应该始终在FROM子句之外运行 Set-Returning Functions ?
postgresql performance database-internals functions set-returning-functions
我正在尝试调整在 20 列上调用相同表值函数 (TVF) 的查询。
我做的第一件事是将标量函数转换为内联表值函数。
是否使用性能CROSS APPLY最佳的方式在查询中的多个列上执行相同的函数?
一个简单的例子:
SELECT Col1 = A.val
,Col2 = B.val
,Col3 = C.val
--do the same for other 17 columns
,Col21
,Col22
,Col23
FROM t
CROSS APPLY
dbo.function1(Col1) A
CROSS APPLY
dbo.function1(Col2) B
CROSS APPLY
dbo.function1(Col3) C
--do the same for other 17 columns
Run Code Online (Sandbox Code Playgroud)
有更好的选择吗?
可以在针对 X 个列的多个查询中调用相同的函数。
这是函数:
CREATE FUNCTION dbo.ConvertAmountVerified_TVF
(
@amt VARCHAR(60)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
WITH cteLastChar
AS(
SELECT LastChar = RIGHT(RTRIM(@amt), 1)
) …Run Code Online (Sandbox Code Playgroud) performance sql-server optimization functions sql-server-2016 query-performance
是否可以重载 sql server 函数?是标量,如 ltrim,还是聚合函数,如计数?
即使这是一个非常非常糟糕的主意。是否可以?
有点重复T-SQL 用户定义的函数重载?我会说它不是 100% 重复,因为那是 2005 年的版本。也许这已经改变了?
在阅读了一篇日期为2012年的关于未记录的函数fn_dblog 和 fn_dump_dblog的文章后,我想知道如果它们已经存在很长时间并且非常有用,为什么它们仍然未记录且不受支持。与这篇2004 年的sp_msforeachtable 和 sp_msforeachdb文章相同。
我可以从其中一个回答论坛上的问题中受益(在日志备份期间是将数据备份到操作开始还是结束?),但我想知道为什么它们随 SQL Server 一起提供直到现在,以未记录和不受支持的方式。
我知道有人说他们不可靠,但如果这是唯一的原因,他们本可以在 16 年内得到纠正。所以一定有另一种解释。
functions ×10
sql-server ×4
performance ×3
postgresql ×3
mysql ×2
array ×1
datatypes ×1
ddl ×1
null ×1
optimization ×1
plpgsql ×1
string ×1
substring ×1
trigger ×1
update ×1