我有这张表:
CREATE TABLE accounts (
id BIGINT NOT NULL UNIQUE,
balance INTEGER DEFAULT 0
);
Run Code Online (Sandbox Code Playgroud)
我需要在将行插入 2 个不同的表后更新每个用户的余额,transfers并且deposits.
我创建了 2 个函数来计算新用户余额并更新它:
/* function for getting user balance */
CREATE FUNCTION get_balance(bigint) RETURNS bigint
AS 'SELECT (
SELECT COALESCE(sum(CASE WHEN won THEN amount * (multiplier - 1) ELSE -amount END), 0)
FROM transfers
WHERE user_id = $1
) + (
SELECT COALESCE(sum(amount), 0)
FROM deposits
WHERE user_id = $1
) as sum;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个SELECT从中pg_catalog提取函数名称、其架构名称和创建该函数的扩展名的函数。
拉取我使用的函数列表(简化版本)
SELECT pg_proc.proname, pg_namespace.nspname AS proschema
FROM pg_proc
INNER JOIN pg_namespace ON (pg_namespace.oid = pg_proc.pronamespace)
Run Code Online (Sandbox Code Playgroud)
要选择我可以运行的扩展
SELECT pg_extension.extname, pg_namespace.nspname as extschema
FROM pg_catalog.pg_extension
INNER JOIN pg_catalog.pg_namespace ON (pg_namespace.oid = pg_extension.extnamespace)
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找它们在“”时创建的扩展和函数之间的链接CREATE EXTENSION。理想情况下,SELECT 应该生成 extension_name、extension_schema、foo_name、foo_schema 的列表
升级到 SQL Server 2019 后,我们在 beta 环境中遇到异常错误。从标量值函数中进行选择时会发生这种情况。在我们运行 SQL 2014 的生产环境中不会发生此错误。
声明是:
select function(1234567)
Run Code Online (Sandbox Code Playgroud)
错误信息是:
消息 229,级别 14,状态 5,第 1 行
对象“函数”、数据库“数据库”、架构“dbo”的 SELECT 权限被拒绝。
功能是:
CREATE FUNCTION [dbo].[function](@var1 INT)
RETURNS BIT
BEGIN
DECLARE @var2 BIT, @var3 BIGINT, var4 INT
SET @var2 = 0
SELECT @var3= ISNULL(tbl2.field1,tbl3.field1) FROM tbl1
LEFT OUTER JOIN tbl2 WITH (NOLOCK) ON tbl2.field2 = tbl1.field2
LEFT OUTER JOIN tbl3 WITH (NOLOCK) ON tbl3.field2 = tbl1.field2
WHERE tbl1.field2 = @var1
SELECT @var4 = ISNULL(field4,1) FROM linked_server.database.dbo.tbl4 WHERE field5=Convert(VARCHAR(20),@var3)
IF(@var4 …Run Code Online (Sandbox Code Playgroud) 我正在处理相当长的视图,其中一个 SQL 语句调用了标量函数,这确实降低了性能。以下是在 select 语句中调用的函数。(SQL Server 2016)
真的不确定修改这个过程的最佳方法。
简化的选择语句。
Select vendorpartid,
dbo.ufn_StockUomQuantityToOrder(vpp.priorityLevel, vpp.monthlyUsageRate, vpp.minimumPurchaseUomOrderQuantity, vpp.purchaseUomConversionFactor, vpp.orderFrequencyDays, vpp.boxQuantity) stockUomQuantityToOrder
FROM vendorpartpriority vpp
ALTER FUNCTION [dbo].[ufn_StockUomQuantityToOrder] (
@priorityLevel decimal(38, 10),
@monthlyUsageRate decimal(38,10),
@minimumPurchaseUomOrderQuantity decimal(38, 10),
@purchaseUomConversion decimal(38, 10),
@orderFrequencyDays decimal(38,10),
@boxQuantity int
)
RETURNS int
WITH SCHEMABINDING
AS
-- Calculate the quantity that needs to be ordered
BEGIN
DECLARE @quantityToOrderDecimal decimal(38, 10) = NULL;
DECLARE @quantityToOrderInt int = NULL;
DECLARE @orderFrequencyMinimumQuantity decimal(38, 10) = NULL;
DECLARE @minimumStockUomOrderQuantity decimal(38,10) = NULL;
--set the …Run Code Online (Sandbox Code Playgroud) 我正在和一位同事讨论解决问题的方法。
我们有一个表来跟踪填充过程,该表在列Lot和上具有唯一的索引列(或至少应该) TestGrade。
最近,我们添加了逻辑,以便当TestGrade创建大于 1 的任何值时,所有较低级别都会被创建。完成了一些逻辑,因此较低级别的行不一定与顶层相同。
例如,我插入一些东西Lot='ABCD',TestGrade=5然后在我的Fills表中我看到
id Lot TestGrade OtherColumns
======================================
10 'ABCD' 1 blah3
9 'ABCD' 2 bar
8 'ABCD' 3 foo
7 'ABCD' 4 blah1
6 'ABCD' 5 blah
Run Code Online (Sandbox Code Playgroud)
现在的问题是在许多情况下,我只想要 Fills 表的顶级记录,因此在示例中,我只想要带有id=6.
关于如何做到这一点,我们有两个想法。我想做一个看起来像
CREATE VIEW [dbo].[vwFills]
AS
SELECT t.* FROM [dbo].[Fills] t
JOIN (SELECT [Lot], MAX(TestGrade) as TestGrade FROM dbo.Fills GROUP BY [Lot]) t2 ON t.[Lot] = t2.[Lot] AND t.[TestGrade] = t2.[TestGrade]
Run Code Online (Sandbox Code Playgroud)
我的同事想做类似的事情,但在一个看起来像这样的函数内
ALTER …Run Code Online (Sandbox Code Playgroud) 我在阅读 PostgreSQL 文档时刚刚遇到基于表达式的索引(又名“功能索引”)(我以前不知道此类索引)。
我只是想知道 Microsoft SQL Server 中是否有与此类似/等效的内容?我已阅读有关索引的 SQL Server 文档,但没有看到任何明显相似/等效的内容。
如果这不是正确的论坛,请让我知道并为我移动它。
我刚刚在标量函数的末尾有一堆这样的插入:
INSERT INTO [Raptor].[dbo].[UserRole]
([RoleId]
,[UserId])
VALUES
(3
,@NewUserID)
INSERT INTO [Raptor].[dbo].[UserRole]
([RoleId]
,[UserId])
VALUES
(5
,@NewUserID)
Run Code Online (Sandbox Code Playgroud) 我有一个名为 length 的列定义为:
TYPE_NAME: DECIMAL
DATA_TYPE: 3
COLUMN_SIZE: 9
BUFFER_LENGTH: 11
DECIMAL_DIGITS: 5
NUM_PREC_RADIX: 10
Run Code Online (Sandbox Code Playgroud)
当我运行以下选择时:
select char(length) st_length, length from atable
Run Code Online (Sandbox Code Playgroud)
我在 st_length 列上得到前导零:
st_length length
0043.00000 43.00000
0043.00000 43.00000
0045.00000 45.00000
0044.00000 44.00000
0044.00000 44.00000
0046.00000 46.00000
Run Code Online (Sandbox Code Playgroud)
为什么我得到前导零以及如何摆脱它们?
编辑:我本来想早点说的,但忘了。我正在使用 db2 v9.5.8 LUW。
解决方案:我最初的目标是获得长度最左边的字符。我结束了这个:
select left(char(cast(length as int)),1) st_length, length from atable
Run Code Online (Sandbox Code Playgroud)
这产生了,
st_length length
4 43.00000
4 43.00000
4 45.00000
4 44.00000
4 44.00000
4 46.00000
Run Code Online (Sandbox Code Playgroud)
欢迎改进。
我有一个基于函数的索引,在 9400 万行的表上创建需要 25 分钟。
当我删除索引时,需要 18 分钟。
为什么需要这么长时间?我会认为下降几乎是立即的?我注意到大约 10 分钟后,索引从 user_indexes 中删除,但脚本仍然执行了大约 8 分钟。
该表已分区,这是 Oracle 10g RAC 安装。如果有更多信息有帮助,我可以根据需要添加它。
对此的任何启发将不胜感激。
我正在运行 SQL Server 2008 并且需要备份我创建的 UDF 脚本/查询。如何才能及时做到这一点?我尝试右键单击保存 UDF 的文件夹图标(表值函数)以复制文件夹,但不能打包到。
我唯一能想到的就是在我的 UDF 脚本上使用 MODIFY 命令,然后复制并粘贴到单独的文本文件中。
即使只有一种简单的方法可以将所有脚本保存在一个文本文件中而不是单独的 txt 文件中,我也很乐意这样做,而不必一次复制和粘贴每个文件。
有什么建议?
functions ×10
sql-server ×6
postgresql ×3
index ×2
backup ×1
datatypes ×1
db2 ×1
oracle ×1
oracle-10g ×1
permissions ×1
t-sql ×1
trigger ×1
view ×1