标签: sql-server

为什么 SELECT 1/2 返回 0?

正如标题所说。我什至尝试过SELECT CONVERT(NUMERIC, 1/2)也返回0。

我正在使用 SQL Server 2008。

sql-server-2008 sql-server t-sql

19
推荐指数
2
解决办法
8343
查看次数

SSMS 工具包替代品

是否有任何工具可与SSMS Tools Pack 2012相媲美?许可(每台机器 30 美元,任意数量的机器 100 美元……3 个月)还有很多不足之处,我不确定还有哪些其他选项可用。

例如,我真正怀念的一件事是“保存您运行的每个查询”。在修修补补和研究时,在运行不同版本的查询时进行备份是非常宝贵的。或者当我意识到我没有 2 个月前正在处理的查询的备份时。

说明:SQL Server Management Studio 没有官方插件支持,但有一些工具。SSMS Tools Pack 是我非常喜欢的一个(2005、2008 版本),但是 2012 年的许可费太可怕了。(我会为合理的许可证付费,但这不是这里的问题。)

例如,我发现SSMS BoostSSMS有一些很酷的补充,这似乎是值得的。

SQL Server 2012 还有哪些其他插件可用?我希望有一些东西可以在我点击 F5 时像 SSMS 工具包那样保存查询,或者除了列出的两个工具之外的任何东西?

sql-server ssms sql-server-2012

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

如何在不影响性能的情况下备份大型 SQL Server 数据库?

我们收到了有关查询运行缓慢或在清晨超时的报告,我看到的唯一一项我认为可能会影响它的作业是我们的数据库备份作业。

数据库本身大约有 300GB,备份工作从凌晨 4:30 开始,直到早上 7:00 之后才完成。我们备份作业的当前语法是:

BACKUP DATABASE [DatabaseName]
TO DISK = N'E:\Database Backups\DatabaseName.Bak'
WITH INIT, NOUNLOAD, NAME = N'DatabaseName.Bak',
NOSKIP, STATS = 10, NOFORMAT
Run Code Online (Sandbox Code Playgroud)

E:\ 是服务器上的一个分区,其中包含数据库和数据库备份。

还应该注意的是,这是一个虚拟服务器,而不是专用的独立服务器。在我们切换到虚拟服务器后,我们开始收到关于备份过程中速度变慢的抱怨,所以我认为这可能是相关的。

有没有办法运行此备份作业,使其在运行时不影响查询性能?

我们使用的是 SQL Server 2005

sql-server-2005 sql-server backup

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

为什么链接服务器在 CASE 表达式中限制为 10 个分支?

为什么这个CASE表达式:

SELECT CASE column 
        WHEN 'a' THEN '1' 
        WHEN 'b' THEN '2' 
        ... c -> i
        WHEN 'j' THEN '10' 
        WHEN 'k' THEN '11'  
    END [col] 
FROM LinkedServer.database.dbo.table
Run Code Online (Sandbox Code Playgroud)

产生这个结果?

错误消息:
无法准备消息 8180,级别 16,状态 1,第 1 行语句。
消息 125,级别 15,状态 4,第 1 行
Case 表达式只能嵌套到级别 10。

显然这里没有嵌套CASE表达式,尽管有 10 多个“分支”。

另一个怪事。这个内联表值函数产生相同的错误:

ALTER FUNCTION [dbo].[fn_MyFunction]
(   
     @var varchar(20)
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT CASE column 
            WHEN 'a' THEN '1' 
            WHEN 'b' THEN '2' 
            ... c -> i …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server-2008 sql-server sql-server-2000 linked-server

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

有没有一种很酷的方法可以在数百台机器上为 SQL Server 执行 CU 更新?

我的公司在一夜之间从 50 个 SQL Server 增长到 200 多个。帮助!

我的问题是:

  • 我怎样才能在这么多服务器上执行 CU 更新并且仍然有生命并保持理智?SCCM 似乎无法执行 CU 更新。

  • 有没有其他人能够在 100 台服务器上执行 CU 更新?

  • 还有哪些其他选择?

sql-server installation automation

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

IDENTITY 列中出现意外空白

我正在尝试生成从 1 开始并以 1 递增的唯一采购订单编号。我使用此脚本创建了一个 PONumber 表:

CREATE TABLE [dbo].[PONumbers]
(
  [PONumberPK] [int] IDENTITY(1,1) NOT NULL,
  [NewPONo] [bit] NOT NULL,
  [DateInserted] [datetime] NOT NULL DEFAULT GETDATE(),
  CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC)    
);
Run Code Online (Sandbox Code Playgroud)

以及使用此脚本创建的存储过程:

CREATE PROCEDURE [dbo].[GetPONumber] 
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1);
    SELECT SCOPE_IDENTITY() AS PONumber;
END
Run Code Online (Sandbox Code Playgroud)

在创建时,这工作正常。当存储过程运行时,它从所需的数字开始并以 1 递增。

奇怪的是,如果我关闭或休眠我的计算机,那么下次运行该程序时,序列已提前了近 1000。

见下面的结果:

采购订单编号

你可以看到数字从 8 跃升到了 1002!

  • 为什么会这样?
  • 我如何确保不会像那样跳过数字?
  • 我所需要的只是让 SQL 生成以下数字:
    • a) 保证唯一。
    • b) 增加所需的数量。

我承认我不是 SQL 专家。我是否误解了 SCOPE_IDENTITY() 的作用?我应该使用不同的方法吗?我查看了 SQL 2012+ 中的序列,但微软表示默认情况下不能保证它们是唯一的。

sql-server identity sql-server-2012

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

标识列上的索引应该是非聚集的吗?

对于具有标识列的表,是否应该为标识列创建聚集或非聚集 PK/唯一索引?

原因是将为查询创建其他索引。使用非聚集索引(在堆上)并返回索引未涵盖的列的查询将使用较少的逻辑 I/O (LIO),因为没有额外的聚集索引 b 树查找步骤?

create table T (
  Id int identity(1,1) primary key, -- clustered or non-clustered? (surrogate key, may be used to join another table)
  A .... -- A, B, C have mixed data type of int, date, varchar, float, money, ....
  B ....
  C ....
  ....)

create index ix_A on T (A)
create index ix_..... -- Many indexes can be created for queries

-- Common query is query on A, B, C, ....
select A, …
Run Code Online (Sandbox Code Playgroud)

performance sql-server database-internals index-tuning heap performance-tuning

19
推荐指数
3
解决办法
5821
查看次数

无法在计算列上创建筛选索引

在我之前的一个问题中,在向表中添加新的计算列时禁用锁升级是个好主意吗?,我正在创建一个计算列:

ALTER TABLE dbo.tblBGiftVoucherItem
ADD isUsGift AS CAST
(
    ISNULL(
        CASE WHEN sintMarketID = 2 
            AND strType = 'CARD'
            AND strTier1 LIKE 'GG%' 
        THEN 1 
        ELSE 0 
        END
    , 0) 
    AS BIT
) PERSISTED;
Run Code Online (Sandbox Code Playgroud)

计算列是PERSISTED,并且根据计算列定义(Transact-SQL)

坚持

指定数据库引擎将计算值物理存储在表中,并在计算列所依赖的任何其他列更新时更新值。将计算列标记为 PERSISTED 允许在确定性但不精确的计算列上创建索引。有关更多信息,请参阅计算列上的索引。任何用作分区表的分区列的计算列都必须显式标记为 PERSISTED。当指定 PERSISTED 时,computed_column_expression 必须是确定性的。

但是当我尝试在我的列上创建索引时,我收到以下错误:

CREATE INDEX FIX_tblBGiftVoucherItem_incl
ON dbo.tblBGiftVoucherItem (strItemNo) 
INCLUDE (strTier3)
WHERE isUsGift = 1;
Run Code Online (Sandbox Code Playgroud)

无法在表 'dbo.tblBGiftVoucherItem' 上创建过滤索引 'FIX_tblBGiftVoucherItem_incl',因为过滤器表达式中的列 'isUsGift' 是计算列。重写过滤器表达式,使其不包含此列。

如何在计算列上创建过滤索引?

或者

有替代的解决方案吗?

index sql-server filtered-index sql-server-2014 computed-column

19
推荐指数
3
解决办法
4271
查看次数

不区分大小写的排序规则如何工作?

SQL Server 中的默认排序规则类型允许针对不区分大小写的字符串进行索引,但数据的大小写仍然保留。这实际上是如何工作的?我正在寻找实际的具体细节、位和字节,或详细解释它的好资源。

create table casetest (fruitnames nvarchar(50) not null);
create unique index IX_fruitnames on casetest(fruitnames);

insert into casetest values ('apples');
insert into casetest values ('Pears');
-- this insert fails
insert into casetest values ('pears');

-- this yields 'Pears' as a result
select * from casetest (forceseek) where fruitnames = 'PEARS'

update casetest set fruitnames = 'pears' where fruitnames = 'pEArs'

-- this yields 'pears' as a result
select * from casetest (forceseek) where fruitnames = 'PEARS'
Run Code Online (Sandbox Code Playgroud)

罗伯特·谢尔顿 (Robert Sheldon) …

sql-server collation

19
推荐指数
2
解决办法
2413
查看次数

对于圣经希伯来语,我应该使用哪种排序规则?

对于圣经希伯来语,我应该使用哪种 SQL Server 排序规则?所考虑的数据库需要适应变音符号(即元音、重音、比喻等)。

database-design sql-server collation configuration sql-server-2017

19
推荐指数
2
解决办法
1929
查看次数