小编mar*_*c_s的帖子

删除和创建存储过程

昨天我们在我的项目中看到了一些生产问题。当许多用户访问 SQL Server 中的报告时,它超时并且 CPU 上升到 100%。当我们检查后端时,大约有 60 个会话处于打开状态。我们刚刚决定删除并创建存储过程。我们删除并重新创建了存储过程,CPU 变为 40%,问题已解决。

你能告诉我可能是什么原因吗?今天在不同的存储过程中发生了这种情况,但我们立即删除并重新创建了存储过程以解决该问题。

performance sql-server

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

刷新对表的 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
查看次数

存储过程中的 sp_msforeachdb 不能正常工作

我正面临奇怪的行为。

以下是重现方法:在具有多个数据库的实例(在我的情况下为 SQL Server 2016)中,创建该存储过程(master在我的情况下):

create procedure dbo.Strange WITH EXECUTE AS owner
as
begin
    exec sp_MSforeachdb 'select''?''';
end;
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令调用该存储过程:

Exec master.dbo.Strange
Run Code Online (Sandbox Code Playgroud)

正如您将看到的,它只会返回某些数据库的数据,而不是全部(在我的例子中是 11 个中的 3 个)。

怎么了?

sql-server sql-server-2016

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

获取 SQL Server 的主要和次要版本

运行以下查询:

SELECT 
    SERVERPROPERTY('productversion') AS version,
    SERVERPROPERTY('ProductMajorVersion') AS major, 
    SERVERPROPERTY('ProductMinorVersion') AS minor;
Run Code Online (Sandbox Code Playgroud)

产生以下结果:

version      major   minor
------------ ------- -------
10.0.2531.0  NULL    NULL
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

sql-server-2008 sql-server

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

在 SQL Server 数据库中存储 PLC 数据

我正在开发一种软​​件解决方案,需要将源自许多 PLC(可编程逻辑控制器,用于控制传送带和机器人等工业机器)的原始数据点存储到 SQL Server 数据库中。我主要关心的是如何正确存储大量原始数字数据。

每个数据点具有以下属性:

  1. 日期时间戳
  2. 可能是:布尔值、整数、浮点数或字符串
  3. 全年每秒可存储一个数据点(每年约 31,536,000 个数据点)

我从中收集数据的每个 PLC 可能有多达 500 个数据点,我想计划支持数千个 PLC。这意味着,我每年至少有 15,768,000,000,000 个数据点(每年 31,536,000 个点 * 500 个点 * 1000 个 plcs)。我目前为每种数据类型(bool、int、float、string)都有一个表。为了减少记录和存储的数量,我为每条记录存储了 4 个数据点 [ID、DateTime、DataGroupID、Value1、Value2、Value3、Value4]。

我实现了这个,它运行良好(使用我最大的表进行约 7200 万条记录的快速查询),尽管它不是很灵活(更改数据类型需要在表之间移动数据,重新分组数据需要表/列更改,等等。)

因此,我想提高灵活性的想法是保留数据类型特定的表,而只是将每个数据点存储为自己的记录。bigint 的最大大小(记录 ID 的数据类型)的一些简短数学表明我有很多可用的 ID。尽管存储要求和查询性能仍然是一个问题。我应该担心使用这种方法的任何事情吗?有更好的选择吗?

我担心的根源是我根本没有体验过巨大的数据库/表,所以虽然我知道几百万条记录很小,但我仍然不知道一个过顶的表会是什么样子。此外,数据的存储是我的软件的基础,因此更新需要大量工作才能实现。

storage table sql-server-2016

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

通过 SQL Server 中的数据库邮件进行健康检查

我有一些 SQL 脚本,希望每天在我的 SQL Server 上运行。如何多次查询并获得类似于以下内容的输出:

Health check for <server>

Query Title 1:

<query results 1>


Query Title 2:

<query results 2>
Run Code Online (Sandbox Code Playgroud)

我正在检查诸如上次良好备份、正常运行时间等内容,因此它们彼此不相关。我计划在 SQL Server 作业中使用 sp_send_db_mail。这是完成这项任务的最佳方式吗?

理想情况下,我只想要一封电子邮件。

更新

经过多年的战斗!!!到目前为止,我找到的解决方案是将其放入存储过程,然后像这样执行存储过程:

EXEC msdb.dbo.sp_send_dbmail
        @recipients = N'<email>',
        @body = @body, 
        @subject = @subjectt,
        @profile_name = @ProfileName,
        @query ='exec test..sp_checks'
Run Code Online (Sandbox Code Playgroud)

这可以用于多个选择语句吗?

sql-server-2005 sql-server-2008

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

SQL Server 2008:什么是英文分词器?

我正在尝试复制 SQL Server 2008 在生成全文索引时所做的事情,但我很难找到 SQL Server 2008 认为是断字的字符列表。

是否有一个列表指定 SQL Server 2008 将在英文全文索引的哪些字符上断词?

sql-server-2008 full-text-search

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

为什么简单更新的时间不与记录数成线性关系?

我正在运行一些性能测试,我从 900.000 条记录的数据集开始,更新需要 10 秒或每秒大约 90000 条记录。然后我将记录数增加到 9.000.000,更新耗时 170 秒或每秒更新约 52941 条记录。

为什么当记录总数增加时每秒更新的记录数会下降?

数据中的分布是一样的,较大的集合是复制10次的较小的集合。自从我复制了 10 次数据以来,数据和日志文件的大小确实增加了。在那之后我确实缩小了日志文件。此时数据库服务器上没有其他工作负载。

执行更新的存储过程如下:

CREATE PROCEDURE updatePoints      
    @ids NVARCHAR(MAX)    
AS 
    DECLARE @points1 INT
    DECLARE @points2 INT

    SET @points1 = 1
    SET @points2 = 2

    UPDATE p
    SET points = (0 + CASE WHEN p.[x] = m.[x] AND p.[y] = m.[y]
                              THEN @points1
                              ELSE 0
                      END + 
                      CASE WHEN p.[u] = m.[u] AND p.[v] = m.[v]
                              THEN @points2
                              ELSE 0
                      END)
    FROM p 
    JOIN  m ON m.id = …
Run Code Online (Sandbox Code Playgroud)

performance sql-server

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

迄今为止,SQL Server 2008 中的 Varchar

varchar在数据库表中有数据,它以DD-MM-YYYY格式存储日期。

我想varcharMM-DD-YYYY格式中选择它。

我正在使用

select convert (varchar(30), (select CONVERT(datetime, '16-11-2011', 103)), 101)
Run Code Online (Sandbox Code Playgroud)

它给 11/16/2011

对此可以进行任何简单的查询吗?

sql-server-2008 date-format

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

将 SQL Server 移至新域后,YYYY-MM-DD 已更改为 YYYY-DD-MM 我如何切换回来?

我已经移动了我的 SQL Server 的域,虽然一切主要都在工作,但查询的日期格式似乎已经改变。

所以如果我运行这个:

select convert(datetime,'2012-02-13')
Run Code Online (Sandbox Code Playgroud)

我得到

消息 242,级别 16,状态 3,第 1 行
varchar 数据类型到 datetime 数据类型的转换导致值超出范围。

当我跑

select @@Language, @@Langid
Run Code Online (Sandbox Code Playgroud)

我得到

英国 | 23

我试图设置 sp_defaultlanguage 但这似乎没有区别。

我还检查了控制面板中的区域设置,似乎也设置为英国。

甚至此代码示例也会导致问题:

set language british

select convert(datetime, '2012-02-13')
Run Code Online (Sandbox Code Playgroud)

结果

将语言设置更改为英国。消息 242,级别 16,状态 3,第 3 行 varchar 数据类型到 datetime 数据类型的转换导致值超出范围。

sql-server-2008 date-format

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