今天早些时候,我意识到我犯了一个非常愚蠢的错误。我没有编写视图,而是编写了无参数内联表值函数。这让我思考:除了界面之外,两者之间有什么区别吗?据我所知,它们在逻辑上是相同的并且执行相同。
那么,换句话来说,视图提供了哪些无参数内联表值函数所没有的功能呢?我想到的只是索引视图,但我从未见过有人真正使用它们。
我听说 SQL Server 中函数和存储过程的区别在于函数不存储在数据库中,而存储过程存储在数据库中。
真的吗?如果不是,它们之间有什么区别?
另外,我知道存储过程只编译一次,然后直接执行。函数呢?
我正在开发一个带有两个参数的用户定义函数:
create or replace function gesio(
events_table_in regclass,
events_table_out regclass)
returns void as $$ ... $$
Run Code Online (Sandbox Code Playgroud)
events_table_in并events_table_out具有完全相同的架构。
简单解释一下,我遍历 的记录events_table_in,操作记录并希望以events_table_out以下方式追加(插入)操作的记录:
OPEN recCurs FOR execute
format('SELECT * FROM %s order by session_id, event_time', event_table_in);
LOOP
FETCH recCurs into rec;
if not found then
exit;
end if;
-- 1. do something with rec
-- 2. insert the rec into events_table_out
end loop;
Run Code Online (Sandbox Code Playgroud)
我怎样才能保存rec到events_table_out?
观察:我在 PostgreSQL 实例中的一个表上有一个串行索引,并且我执行了一个将新记录插入到该表中的函数。函数失败(原因不重要),事务被回滚......但索引增加并且没有回滚。这会导致未使用的序列值,例如具有索引 1、2、4、5、7 等且没有删除的表。
问题:有什么办法可以回收丢失的序列值,或者防止失败的函数增加索引?
我知道有其他方法可以缓解这个潜在问题,但我仍然很好奇。
我有两个表 A 和 B(具有完全相同的列和整体结构),我正在尝试创建一个带有选择的 TVF,它根据传递给 TVF 的参数选择使用 A 或 B:
create function dbo.testing(@switch varchar(1))
returns @SomeData table (data int)
begin
insert into @SomeData
select
number
from
[[either A or B depending on the value of @switch]] <===== ???
return
end;
Run Code Online (Sandbox Code Playgroud)
从右边进来的箭头表示我不知道如何处理。
这样做的正确方法是什么?我知道我不能只是在那里打一根绳子,那么最好的方法是什么?
我正在使用 SQL Server 2008,我正在寻找类似ltrim和的函数rtrim它也将删除前导和尾随制表符、双空格、回车、换行等。
有许多函数,但我发现所有函数都有限制,例如将字符串截断为 8000 个字符。例如(根据一些评论):
SQL SERVER – 2008 – 增强的 TRIM() 函数 – 删除尾随空格、前导空格、空格、制表符、回车符、换行符
其中一个评论提出了一个更好的解决方案,但- 1导致incorrect syntax错误,我不知道为什么。
CREATE FUNCTION dbo.SuperTrimLeft(@str varchar(MAX)) RETURNS varchar(MAX)
AS
BEGIN
IF (ASCII(LEFT(@str, 1)) < 33) BEGIN
SET @str = STUFF(@str, 1, PATINDEX('%[^'+CHAR(0)+'-'+CHAR(32)+']%', @str) – 1, ' ');
END;
RETURN @str;
END;
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,完成上述任务的最佳方法是什么?
如果我DBCC LOGINFO对我的数据库运行未记录 的字段,则返回的字段之一是 CreateLSN。这是创建 VLF 时格式为 1629000000070500011 的 LSN。现在已经很长时间了,磁盘使用情况报告的自动增长值早已不复存在。我想将 LSN 转换为日期/时间
对于一次性解决方案,我试过这个
select sys.fn_cdc_map_lsn_to_time ( convert(binary,1629000000070500011) )
Run Code Online (Sandbox Code Playgroud)
但我得到了错误
无效的对象名称 'cdc.lsn_time_mapping'
我觉得我错过了一些简单的东西,但它在暗指我。
我有 TBV 功能。像这样
ALTER FUNCTION [dbo].[fn_Functiont]
(
@accessibleIds ListAccesableIds READONLY
)
RETURNS TABLE
AS
RETURN
(
SELECT d.*, b.Name AS Name, ps.Name AS PaymentSystemName, c.UserName AS UserName, c.FirstName AS ClientFirstName, c.LastName AS LastName, c.Number AS DocumentNumber, c.Id
FROM Document AS d
JOIN System AS ps ON d.SystemId = ps.Id
JOIN Client AS c ON c.Id = d.ClientId
LEFT JOIN Shop AS b ON b.Id = d.ShopId
WHERE d.OperationTypeId IN (2, 4, 5) AND c.Type = 1
)
Run Code Online (Sandbox Code Playgroud)
我想传递给这个包含整数的函数列表。我想创建表值类型,但这里的问题是我如何将 List 输入参数传递给函数?我知道我可以通过 …
sql-server entity-framework functions sql-server-2014 table-valued-parameters
我使用了很多函数来启动和运行网站,该网站中的几乎每个操作都会导致执行 SQL 函数。想象一下,几乎所有的数据处理和网站逻辑都是由数据库和部分网络服务器处理的,疯了吧?不是我的错。
但是这里有一个问题,前端有多个事件处理程序,它们向数据库发送请求并返回请求大量数据,例如单击请求大的JSON字符串,因此用户有可能错误地调用这些SQL通过在短时间内同时单击这些事件来运行,这可能导致数据库连接断开或服务器关闭。
那么,我只需要知道是否可以防止 SQL 函数在短时间内多次执行?或者至少在返回数据之前执行一次?如何?
我对如何做某事没有疑问,但我是否应该这样做。抱歉,如果有更合适的论坛。
我有一个功能:
CREATE OR REPLACE FUNCTION get_name(user_id UUID) RETURNS TEXT AS $$
SELECT username
FROM users
WHERE users.id=user_id
$$ LANGUAGE 'sql';
Run Code Online (Sandbox Code Playgroud)
我喜欢使用这个函数在其他查询中从 user_id 转换为用户名。这是一个常见的操作,我认为一个函数会加快开发时间,以查找一次性统计数据以进行数据分析。我不关心查询速度。这是使用函数来执行此操作的好习惯还是我应该只执行连接?
我对此很陌生,我的同事说将函数用于常规选择/连接可以执行的操作是不好的做法。他还提到,函数最好用于常规选择无法完成的事情。所以我想问其他人什么是好的做法?
编辑:如果这是一种不好的做法,那么对于函数执行稍微复杂一些的常见操作的情况是否更合理?
functions ×10
sql-server ×6
postgresql ×3
index ×1
insert ×1
plpgsql ×1
record ×1
sequence ×1
t-sql ×1
view ×1