标签: sql-server-2014

如何使用密码将登录名从 2008R2 转移到 2014?

我已经尝试Tasks>Generate Scripts...并在高级脚本选项中设置了“脚本登录”,但我在输出中得到了这个:

/* For security reasons the login is created disabled and with a random password. */
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以使用密码对这些登录进行脚本编写,或者使用其他方法将登录从 2008R2 实例转移到 2014 实例?

sql-server sql-server-2008-r2 sql-server-2014

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

Switching Data In Fails with“允许目标表上的检查约束或分区函数不允许的值”

鉴于以下

-- table ddl
create table dbo.f_word(
    sentence_id int NULL,
    sentence_word_id int NULL,
    word_id int NULL,
    lemma_id int NULL,
    source_id int NULL,
    part_of_speech_id int NULL,
    person_id int NULL,
    gender_id int NULL,
    number_id int NULL,
    tense_id int NULL,
    voice_id int NULL,
    mood_id int NULL,
    case_id int NULL,
    degree_id int NULL,
    citation nvarchar(100) NULL
);
-- create partition function
create partition function pf_f_word_source_id (int)
as range left for values 
(
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,
    15,16,17,18,19,20,21,22,23
);

-- create the partition scheme
create partition scheme ps_f_word …
Run Code Online (Sandbox Code Playgroud)

sql-server partitioning sql-server-2014

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

SQL Server 2014 (windows 2012R2) 上的 CLR 崩溃

我有这个小型 CLR,它对列中的字符串执行 RegEX 函数。

在 Windows Server 2012R2 上的 SQL Server 2014 (12.0.2000) 上运行时,进程崩溃

Msg 0, Level 11, State 0, Line 0 当前命令发生严重错误。结果,如果有的话,应该被丢弃。

如果我这样做,并给出堆栈转储

select count (*) from table where (CLRREGEX,'Regex')
Run Code Online (Sandbox Code Playgroud)

但是当我这样做的时候

select * from table where (CLRREGEX,'Regex') 
Run Code Online (Sandbox Code Playgroud)

它返回行。

在 Windows 8.1 上运行的相同 SQL Server 版本上完美运行。

有任何想法吗?

-- 编辑就这么简单

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlTypes;           //SqlString, SqlInt32, SqlBoolean
using System.Text.RegularExpressions; //Match, Regex
using Microsoft.SqlServer.Server;     //SqlFunctionAttribute
public partial class UserDefinedFunctions
{
    public static readonly RegexOptions Options = RegexOptions.IgnorePatternWhitespace | …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-clr sql-server-2014

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

这个while循环是否需要显式事务?

SQL Server 2014:

我们有一个非常大(1 亿行)的表,我们需要更新其中的几个字段。

对于日志运输等,我们显然也希望将其保持为一口大小的交易。

如果我们让下面运行一会儿,然后取消/终止查询,那么到目前为止所做的工作会全部提交,还是需要添加明确的 BEGIN TRANSACTION / END TRANSACTION 语句以便我们可以随时取消?

DECLARE @CHUNK_SIZE int
SET @CHUNK_SIZE = 10000

UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01'
where deleted is null or deletedDate is null

WHILE @@ROWCOUNT > 0
BEGIN
    UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01'
    where deleted is null or deletedDate is null
END
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql transaction sql-server-2014

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

如何通过 UNPIVOT(循环连接)使用批处理模式?

我有以下形式的查询:

SELECT ...
FROM ColumnstoreTable cs
CROSS APPLY (
    SELECT *
    FROM (VALUES
        ('A', cs.DataA)
        , ('B', cs.DataB)
        , ('C', cs.DataC)
    ) x(Col0, Col1)
) someValues
Run Code Online (Sandbox Code Playgroud)

这从 Columnstore 支持的子查询 ( ColumnstoreTable) 中获取每一行并将这些行相乘。这本质上是一个UNPIVOT. 真正的查询比这更大。这部分查询会进入其他处理。

这里的问题是这CROSS APPLY是作为一个循环连接实现的,这是一个合理的选择。不幸的是,循环连接不支持批处理模式。

这部分查询对性能非常关键,我怀疑以批处理模式运行它可能对性能非常有益。

我怎样才能重写这个查询,这样我就不会退出批处理模式?

我确实尝试使用临时表而不是VALUES,但这并没有改变这样一个事实,即没有相等连接条件来进行哈希连接。

sql-server columnstore unpivot sql-server-2014 batch-mode

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

WITH CTE 和 WITH CTE (<column_names>) 之间有什么区别?

如在 MSDN 上使用公用表表达式中所示,您可以将 CTE 定义为:

WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
Run Code Online (Sandbox Code Playgroud)

并使用它:

SELECT <column_list> FROM expression_name;
Run Code Online (Sandbox Code Playgroud)

假设我有以下 2 个 CTE

with cte1 as(
select name from Table1
)

with cte2(name) as(
select name from Table1
)
Run Code Online (Sandbox Code Playgroud)

一个查询为两个 CTE 输出相同的结果,因为内部查询是相同的。这两者之间的唯一区别是cte2(name)在其声明中定义了列名( )。

当我执行两个 CTE 时,我看不到执行计划有任何不同。

我只是想知道:

  • 如果我不在 CTE 定义中指定任何列名,这有什么区别?
  • 为什么我应该/不应该在创建 CTE 时指定列名?
  • 它是否会影响查询执行计划?(就我所见,它没有任何区别。)

sql-server cte sql-server-2014

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

HADR 高工作线程使用率

为什么 HADR 池中可用性组的工作线程数会增加到远远超过“通常每个副本有 3-10 个共享线程”的最低使用量?

在一种情况下,我们观察到 300 多个线程的使用情况,总共有 3 个可用性组和 10 个数据库。SQL Server 2014 SP1。

我们的线索是二级副本的备份、主副本的高活动、二级副本的报告。

AG 位于 VMware 上的数据中心。总共 16 个调度程序,通常的工作线程在 200 范围内。服务器上的max_dop为 2。

  • 3 个 AG,10 个 DB,每个副本 4 个 - 主副本,2 个只读,1 个不可读。
  • 1 个次要同步,2 个异步
  • 大型多主机集群上 32 个物理内核上的 16 个 vcores。
  • 没有过度供应。
  • 其他较小的 4-8 核 VM 位于同一位置,但不会占用 CPU

我们观察到导致拒绝服务的工作线程激增。将工作线程归因于 AG 是我们的假设,因为只有那些工作线程才能跨越限制。

在上下文中阅读的 SQL Server Premier 现场工程师博客中的以下链接并没有给我一个完整的答案:

sql-server availability-groups hadr sql-server-2014

12
推荐指数
0
解决办法
1180
查看次数

SQL Server 将表的 IDENTITY VALUE 物理存储在何处?

我希望有人可以为我指出正确的方向。到目前为止,这是我的工作。

SELECT * FROM sys.identity_columns是一个系统视图,它给出了“last_value”,但该视图的定义使用了一个内部函数IdentityProperty(colName, 'LastValue')- 所以这是一个死胡同(不是从那里的系统表中提取它)。

互联网上的任何地方(我看过)都建议使用DBCC IDENT_...命令来揭示价值,但这仍然让我对它的实际存储位置一无所知。

因此,我开始DBCC PAGE(TestDB,1,1325,3)根据我的测试工具数据库搜索各个页面,并使用该RESEED命令在值 10 和 12 之间重新设定种子。

在这一过程中,我注意到的十六进制值IAM: HeaderIAM: Single Page Allocations并且IAM: Extent Alloc Status Slot 1一切都改变了。(并且意识到它们无论如何都会随着bUse1值定期更改,而bUse1值也会自行递增)。

所以另一个死胡同,我完全没有想法。我还能在哪里搜索?

我正在运行 SQL Server 2014。我对内部知识有着永不满足的渴望,但还没有遇到过像这样难以捉摸的东西。它引起了我的注意,因为从理论上讲,它(绝对值)存储在某处并且应该(可以说)是可定位的。在我寻找内部存储数据/元数据的位置的过程中,这个特殊的价值让我觉得特别难以捉摸。我猜/希望有人会过来告诉我,你可以得到它,DBCC PAGE但我找错了地方。

sql-server database-internals identity sql-server-2014

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

使用 SQL Server FILESTREAM 时保持(部分)备份较小

我有一个包含近 1TBFILESTREAM数据的数据库,我不需要备份(如果数据被删除,它会在几个小时内自动重新创建,所以它并不重要)。大多数数据每隔几天就会更改一次,因此差异备份并不能真正帮助减小大小。

通过将恢复模式设置为Full,创建一个单独FILEGROUPFILESTREAM,然后只备份“主要”,我让备份按照我需要的方式工作FILEGROUP。这导致的问题是日志文件(也被备份)现在不必要地大,因为它包含FILESTREAM数据。

SIMPLE恢复模式剥夺了我对特定FILEGROUPs进行备份的能力,所以我认为这也不是一种选择。

我的想法是将FILESTREAM数据移动到一个单独的数据库,但现在我正在失去参照完整性,并且肯定还会继承许多其他问题。

有没有办法在Simple恢复模式下创建部分备份(不将FILESTREAM表设置为只读)?如果没有,我的问题还有其他合理的解决方案吗?

sql-server backup transaction-log filestream sql-server-2014

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

带有输出的 MERGE 是否比条件插入和选择更好的做法?

我们经常会遇到“如果不存在,则插入”的情况。Dan Guzman 的博客对如何使此进程线程安全进行了出色的调查。

我有一个基本表,它只是将字符串从SEQUENCE. 在存储过程中,我需要获取该值的整数键(如果它存在),或者INSERT它然后获取结果值。该dbo.NameLookup.ItemName列有一个唯一性约束,因此数据完整性没有风险,但我不想遇到异常。

这不是一个IDENTITY所以我无法获得,SCOPE_IDENTITY并且NULL在某些情况下价值可能是。

在我的情况下,我只需要处理INSERT桌面上的安全问题,所以我试图决定是否使用MERGE这样的方法更好:

SET NOCOUNT, XACT_ABORT ON;

DECLARE @vValueId INT 
DECLARE @inserted AS TABLE (Id INT NOT NULL)

MERGE 
    dbo.NameLookup WITH (HOLDLOCK) AS f 
USING 
    (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item
        ON f.ItemName= new_item.val
WHEN MATCHED THEN
    UPDATE SET @vValueId = f.Id
WHEN NOT MATCHED BY TARGET THEN
    INSERT …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql merge sql-server-2014

12
推荐指数
2
解决办法
4890
查看次数