小编Pau*_*ite的帖子

如何使用表值函数连接表?

我有一个用户定义的函数:

create function ut_FooFunc(@fooID bigint, @anotherParam tinyint)
returns @tbl Table (Field1 int, Field2 varchar(100))
as
begin
  -- blah blah
end
Run Code Online (Sandbox Code Playgroud)

现在我想在另一张桌子上加入这个,就像这样:

select f.ID, f.Desc, u.Field1, u.Field2
from Foo f 
join ut_FooFunc(f.ID, 1) u -- doesn't work
where f.SomeCriterion = 1
Run Code Online (Sandbox Code Playgroud)

换句话说,所有的Foo记录,其中SomeCriterion1,我想看到的Foo IDDesc,旁边的值Field1,并Field2认为从返回ut_FooFunc的的输入Foo.ID

这样做的语法是什么?

join sql-server syntax sql-server-2012 functions

66
推荐指数
1
解决办法
12万
查看次数

我应该什么时候重建索引?

我应该什么时候重建我的关系数据库 (SQL Server) 中的索引?

是否有定期重建索引的情况?

sql-server index-maintenance

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

使用窗口函数的日期范围滚动总和

我需要计算一个日期范围内的滚动总和。为了说明,使用AdventureWorks 示例数据库,以下假设语法将完全满足我的需要:

SELECT
    TH.ProductID,
    TH.TransactionDate,
    TH.ActualCost,
    RollingSum45 = SUM(TH.ActualCost) OVER (
        PARTITION BY TH.ProductID
        ORDER BY TH.TransactionDate
        RANGE BETWEEN 
            INTERVAL 45 DAY PRECEDING
            AND CURRENT ROW)
FROM Production.TransactionHistory AS TH
ORDER BY
    TH.ProductID,
    TH.TransactionDate,
    TH.ReferenceOrderID;
Run Code Online (Sandbox Code Playgroud)

遗憾的是,RANGE窗口框架范围目前在 SQL Server 中不允许间隔。

我知道我可以使用子查询和常规(非窗口)聚合编写解决方案:

SELECT 
    TH.ProductID,
    TH.TransactionDate,
    TH.ActualCost,
    RollingSum45 =
    (
        SELECT SUM(TH2.ActualCost)
        FROM Production.TransactionHistory AS TH2
        WHERE
            TH2.ProductID = TH.ProductID
            AND TH2.TransactionDate <= TH.TransactionDate
            AND TH2.TransactionDate >= DATEADD(DAY, -45, TH.TransactionDate)
    )
FROM Production.TransactionHistory AS TH
ORDER BY
    TH.ProductID,
    TH.TransactionDate, …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql sql-server-2012 window-functions query-performance

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

SCHEMABINDING 万圣节保护之外的功能是否有任何好处?

众所周知,SCHEMABINDING一个函数可以避免更新计划中不必要的假脱机

如果您使用不涉及任何表(即不访问数据)的简单 T-SQL UDF,请确保SCHEMABINDING在创建 UDF 期间指定该选项。这将使 UDF 模式绑定并确保查询优化器不会为涉及这些 UDF 的查询计划生成任何不必要的假脱机运算符。

SCHEMABINDING即使不访问数据,函数还有其他优势吗?

sql-server functions

56
推荐指数
1
解决办法
8625
查看次数

为什么 DROP DATABASE 需要这么长时间?(MySQL)

新的 CentOS 安装。

我正在运行一个大型数据库(2GB sql 文件)的导入并且遇到了问题。SSH 客户端似乎失去了连接,导入似乎冻结了。我使用另一个窗口登录到 mysql 并且导入似乎已死,卡在特定的 3M 行表上。

所以我试过了

DROP DATABASE huge_db;
Run Code Online (Sandbox Code Playgroud)

15-20分钟后,什么都没有。在另一个窗口中,我做了:

/etc/init.d/mysqld restart
Run Code Online (Sandbox Code Playgroud)

DROP DB 窗口显示消息:SERVER SHUTDOWN。然后我实际上重新启动了物理服务器。

重新登录到 mysql,检查并且数据库还在那里,然后运行

DROP DATABASE huge_db;
Run Code Online (Sandbox Code Playgroud)

再一次,我已经等了大约 5 分钟。

再次,这是全新安装。这huge_db是唯一的数据库(系统数据库除外)。我发誓我之前和很快就放弃了这么大的 db,但也许我错了。

我已经成功删除了数据库。大约花了 30 分钟。另请注意,当我认为 mysqldump 导入已死时,我认为我错了。终端连接丢失,但我认为该过程仍在运行。我很可能杀死了导入中间表(3M 行表),并且可能杀死了整个数据库的 3/4。“top”显示 mysql 只使用了 3% 的内存,而看起来它应该使用更多内存,这是一种误导。

删除数据库最终需要 30 分钟,因此,我可能不必重新启动服务器,也可能只是等待 DROP 完成,但我不知道 mysql 会如何对获取 DROP 查询做出反应它通过 mysqldump 导入的同一个数据库。

尽管如此,问题仍然存在,为什么在删除所有 db 文件并从 information_schema 中删除对 DB 的所有引用时,DROP 2GB 数据库需要 30 分钟以上?有什么大不了的?

mysql mysqldump

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

如何在 SQL Server 中将日期和时间与 datetime2 结合起来?

鉴于以下组件

DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'
Run Code Online (Sandbox Code Playgroud)

将它们结合起来以产生DATETIME2(7)具有价值的结果的最佳方法是'2013-10-13 23:59:59.9999999'什么?

有些东西工作,如下表所示。


SELECT @D + @T 
Run Code Online (Sandbox Code Playgroud)

操作数数据类型日期对加法运算符无效。


SELECT CAST(@D AS DATETIME2(7)) + @T 
Run Code Online (Sandbox Code Playgroud)

操作数数据类型 datetime2 对加法运算符无效。


SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)
Run Code Online (Sandbox Code Playgroud)

datediff 函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试将 datediff 与不太精确的日期部分一起使用。

* 可以在 Azure SQL 数据库和 SQL Server 2016 中避免溢出,使用DATEDIFF_BIG.


SELECT CAST(@D AS DATETIME) + @T 
Run Code Online (Sandbox Code Playgroud)

数据类型 datetime 和 time 在 add 运算符中不兼容。


SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

返回结果但失去精度 2013-10-13 23:59:59.997

sql-server datatypes date time datetime2

55
推荐指数
3
解决办法
6万
查看次数

如何检查与表相关的外键

如何在MySql中查看与表相关的外键?

背景:我想在 MySql 中删除一个具有外键约束的表。当我这样做时,我得到了这个:

Error Code: 1217. Cannot delete or update a parent row: a foreign key constraint fails

如何删除与表相关的外键离开其他人。

mysql foreign-key constraint drop-table

55
推荐指数
1
解决办法
12万
查看次数

SQL Server CASE 语句是评估所有条件还是在第一个 TRUE 条件时退出?

SQL Server(特别是 2008 或 2012)CASE语句是评估所有WHEN条件还是在找到WHEN评估为真的子句后退出?如果它确实通过了整个条件集,这是否意味着最后一个条件评估为 true 会覆盖第一个评估为 true 的条件所做的事情?例如:

SELECT
    CASE
        WHEN 1+1 = 2 THEN'YES'
        WHEN 1+1 = 3 THEN 'NO'
        WHEN 1+1 = 2 THEN 'NO' 
    END
Run Code Online (Sandbox Code Playgroud)

结果是“YES”,即使最后一个 when 条件应该使它评估为“NO”。一旦找到第一个 TRUE 条件,它似乎就退出了。有人可以确认是否是这种情况

sql-server t-sql case

53
推荐指数
3
解决办法
11万
查看次数

过多的排序内存授予

为什么这个简单的查询被授予如此多的内存?

-- Demo table
CREATE TABLE dbo.Test
(
    TID integer IDENTITY NOT NULL,
    FilterMe integer NOT NULL,
    SortMe integer NOT NULL,
    Unused nvarchar(max) NULL,

    CONSTRAINT PK_dbo_Test_TID
    PRIMARY KEY CLUSTERED (TID)
);
GO
-- 100,000 example rows
INSERT dbo.Test WITH (TABLOCKX)
    (FilterMe, SortMe)
SELECT TOP (100 * 1000)
    CHECKSUM(NEWID()) % 1000,
    CHECKSUM(NEWID())
FROM sys.all_columns AS AC1
CROSS JOIN sys.all_columns AS AC2;
GO    
-- Query
SELECT
    T.TID,
    T.FilterMe,
    T.SortMe,
    T.Unused
FROM dbo.Test AS T 
WHERE 
    T.FilterMe = 567
ORDER BY 
    T.SortMe;
Run Code Online (Sandbox Code Playgroud)

对于估计 …

sql-server execution-plan memory-grant

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

数据库管理员常用的首字母缩略词

数据库管理员中最常用的首字母缩略词是什么?它们的相关含义是什么?

这适用于社区以及在使用数据库等时搜索常用术语和首字母缩略词含义的人。

terminology

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