标签: t-sql

我可以将数据库的文件组设置为脱机,更改文件的位置并使其重新联机吗?

我发现我们只能通过 t-sql 使文件组脱机,但要使该文件组联机,我们需要恢复整个数据库。

sql-server filegroups t-sql

3
推荐指数
1
解决办法
2393
查看次数

在 dm_os_ring_buffers 中转换时间戳

在尝试将其转换为合法时间时,我经常看到这种转换:

SELECT DATEADD (ms, -1 * ((s.cpu_ticks) - r.[timestamp]), GETDATE())
FROM sys.dm_os_ring_buffers r
                CROSS JOIN sys.dm_os_sys_info s
Run Code Online (Sandbox Code Playgroud)

我收到错误:

将表达式转换为数据类型 int 时出现算术溢出错误。

转换这个的正确公式是什么?

答案:ms_ticks

sql-server t-sql

3
推荐指数
1
解决办法
1029
查看次数

更改数据捕获与记录更改的触发器

我将创建由触发器填充的历史表(在插入、更新、删除之后)。由于只有 20% 的列要更新,我决定只记录更改的值 - 如果值没有更改,NULL则将在历史表中使用值。例如:

在此处输入图片说明

sparse与记录所有数据的普通实现相比,历史表列将节省大量空间(这是由于我的测试和我的业务案例)。

作为我的SQL Server 2016 SP1 standard edition支持者,Change Data Capture我想知道他们使用它和基于触发器的日志记录之间有什么优点/缺点/区别?

我检查了一些文章(这里这里),但看不出还有什么Change Data Capture可以给我的。

trigger sql-server t-sql change-data-capture sql-server-2016

3
推荐指数
2
解决办法
6400
查看次数

刷新对表的 DDL 更改

我正在尝试创建巨型脚本,通过添加/删除/修改现有数据库的列来更新一堆表。困扰我的一个问题是,每当我在一个语句的表中添加新列并尝试在另一条语句中引用它时,它都会失败并显示关于无效列 xxx 的错误。

以下是我用来重现此问题的伪代码,

--CREATE TABLE testTable (u_id int, u_name varchar(10))
--INSERT INTO testTable VALUES (1,'11')
--INSERT INTO testTable VALUES (2,'12')
--INSERT INTO testTable VALUES (3,'13')
--INSERT INTO testTable VALUES (4,'14')
--INSERT INTO testTable VALUES (5,'15')

BEGIN
ALTER table testTable ADD u_add varchar(10)
END

BEGIN
CREATE TABLE tmp_xx_xx_testTable (u_id int, u_name varchar(10), u_add varchar(10))

INSERT INTO dbo.tmp_xx_xx_testTable VALUES (6,'16','DDD'  )

INSERT INTO tmp_xx_xx_testTable (u_id,u_name,u_add) 
SELECT u_id,u_name,u_add FROM TestTable

drop TABLE TestTable

EXECUTE sp_rename
                N'[dbo].[tmp_xx_xx_testTable]',
                N'TestTable';
END

--SELECT * …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2012

3
推荐指数
1
解决办法
180
查看次数

有什么方法可以优化具有不同排序规则的 2 个数据库之间的连接?

我正在为一个报告创建一个查询,我们必须在其中进行跨数据库连接。不幸的是,我们必须加入的字段有两个单独的排序规则——“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”。这些之间的连接非常缓慢,并且确实影响了报告的速度 - 有什么方法可以优化它吗?更改排序规则以匹配明智和/或困难吗?

查询的连接部分如下

INNER JOIN EDE.dbo.DeliveryDetail D
              ON D.DeliveryNoteNo COLLATE database_default = Consignments.CustomerReference COLLATE database_default
Run Code Online (Sandbox Code Playgroud)

sql-server collation t-sql

3
推荐指数
1
解决办法
2178
查看次数

加速查询的方法

我的查询返回大约 590 行和 8 列。我遇到的问题是从开始到结束查询需要 2 分 30 秒才能完成。这里的一群人教会了我很多如何编写更有效的查询,所以这里是另一个!

我使用的是date变量而不是变量,datetime因为我的变量只包含一个日期 - 我还使用Aaron Bertrand - Bad Habits To Kickyyyymmdd建议的格式存储我的日期。

我可以做些什么来优化此查询并使结果返回得更快?

DECLARE @Startdate date = '20170101', 
        @Enddate   date = '20170131';

WITH fc As
(
    Select
    Teacher
    ,Team
    ,fc
    FROM [Helper].[dbo].[fc]
)
,ia As
(
    Select
    Teacher
    ,tia
    FROM dbo.ia
    WHERE [hiredate] >= @Startdate
    AND [hiredate] <  DATEADD(DAY,1,@Enddate)
)
,inb As
(
    Select 
    Teacher
    ,tinb
    FROM inb
),
ripcord As
(
    Select
    Teacher
    ,pit
    FROM [homebase].[dbo].[rip] …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization cte t-sql sql-server-2008-r2

3
推荐指数
1
解决办法
2469
查看次数

在相关的产品折扣表中插入最多 10 个缺失的产品

我有两个表:productsproducts_discounts。如果某个产品被指定为“前 10 名”产品,并且在 中缺少定义的折扣products_discounts,我想products_discounts为每个缺少的记录插入一条记录。插入的值将由product_idINSERT INTO中的和另外两个硬编码值组成。

产品
id、product_id、名称、top_ten

Products_Discounts
id、product_id、discount_amount、discount_description

以下是我计划如何手动执行此操作,但由于我将每年重复此过程几次,因此我想看看这是否可以通过几行 SQL 完成。

(1) 获取符合我的条件的产品列表。

SELECT p.product_id, pd.discount_amount FROM products AS p
LEFT OUTER JOIN products_discounts AS pd
    ON p.product_id = pd.product_Id
WHERE p.top_ten = 1
    AND pd.product_id IS NULL
Run Code Online (Sandbox Code Playgroud)

(2) 使用文本编辑器构建每个单独的 INSERT INTO 语句。我会使用步骤 1 的输出来获取product_ids 但其他两个值将保持不变(硬编码)。

INSERT INTO products_discounts (product_id, discount_amount, discount_description)
VALUES ('<product_id goes here>', 10, 'Top 10 Product')
Run Code Online (Sandbox Code Playgroud)

这些步骤可以组合成几行SQL吗?

sql-server t-sql

3
推荐指数
2
解决办法
1035
查看次数

我可以使用不同的排序规则创建 Azure SQL Server(服务器)吗?

我希望我的应用程序在所有数据库级别(服务器、数据库、列)使用相同的排序规则Latin1_General_CI_AS 这是Dan Guzman推荐的具有一致排序规则并从一开始就获得排序规则配置的建议。

Azure SQL Server(服务器)的默认排序规则SQL_Latin1_General_CP1_CI_AS。我想将其更改为Latin1_General_CI_AS。或者使用排序规则 Latin1_General_CI_AS创建一个新的 Azure Sql Server(服务器)。对于本地 SQL Server,这是可能的。

在2010年的SQL Azure 排序规则文档中声明...服务器和数据库排序规则不能在 SQL Azure 中配置...除此之外,我没有发现有用的东西。

如果我可以创建一个新的 Azure SQL Server(服务器),并且排序规则为 Latin1_General_CI_AS ,我会非常高兴。

是否有可能或存在解决方法?我真的很感激任何帮助。

sql-server collation t-sql azure-sql-database

3
推荐指数
1
解决办法
3065
查看次数

获取一年的季度数据

我需要一种查询 SQL 表并按季度提取数据的方法。我知道 SQL Server 有一个DatePart()函数,它有一个参数,q = Quarter我想出了这个语法,但是对于一个包含大约 50,000 行的表,这个语法非常慢。这是实现此结果的最佳方法还是可以进行更多优化?

Declare @startdate date = '20170101', @enddate date = '20171231'
Select
Employeename
,[Total Amount Paid] = SUM(ISNULL(Totalcheckamt,0))
FROM dbo.PaymentHistory
WHERE DatePart(q,[DatePaid]) = 1
AND [DatePaid] BETWEEN CAST(DateAdd(yy, -1, @startdate) As Date) 
                   AND CAST(DateAdd(yy, -1, @enddate) As Date)
GROUP BY Employeename
Order By Employeename ASC
Run Code Online (Sandbox Code Playgroud)

编辑
我想要的返回结果是这样的

Employee Name -- Q1 ---   Q2 ---   Q3 ---    Q4
James           XXXXX.XX  XXXX.XX  XXXX.XX   XXXX.XX
Roger           XXXXX.XX  XXXX.XX  XXXX.XX   XXXX.XX
Run Code Online (Sandbox Code Playgroud)

编辑 …

sql-server-2008 t-sql sql-server-2008-r2

3
推荐指数
1
解决办法
4466
查看次数

使用 VARCHAR 计算

我正在尝试在 SQL Server 2008 R2 中进行计算,但我不断收到错误

消息 245,级别 16,状态 1,第 10
行将 varchar 值“.05”转换为数据类型 int 时转换失败。

更改表结构不是一种选择,有没有办法可以更改查询以便成功执行?

DECLARE @Test1 TABLE
(
  field1 VARCHAR(10),
  field2 INT
);

INSERT INTO @Test1 ( field1, field2 )
    VALUES ( '.05', 12 );

SELECT field1 / field2 
FROM @Test1;
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

3
推荐指数
1
解决办法
1204
查看次数