小编Sol*_*zky的帖子

nvarchar(max) 转换为 varchar 和表优化

我正在使用一个表,该表的所有字符类型都设置为nvarchar其中一些是nvarchar(max). 我们正在将所有这些转换为varchar并根据生产中的实际使用指定字符宽度。对于任何给定的列,生产数据使用 2 个字符到 900 个字符的实际使用宽度范围。我们将在适用时添加 10% 的填充。

-- Insert statements for procedure here
UPDATE Listings WITH (ROWLOCK) 
SET [SubType] = 'S' 
WHERE @idSettings = idSettings AND
    (@idRetsClass = 0 OR idRetsClass = @idRetsClass)
    AND (@idRetsSetting = 0 OR idRetsSetting = @idRetsSetting)
    AND IsNew = 1 AND ([SubType] LIKE '%Single Family Home%' OR [SubType] LIKE '%Modular%' OR [SubType] LIKE '%Mobile Home%' 
    OR [SubType] LIKE '% Story%' OR [SubType] = '' OR [SubType] = 'residential …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 database-design sql-server optimization

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

触发器 - 在动态 SQL 中使用插入/删除的表

在触发器中,我试图创建一个唯一的表名(使用NEWID()),我可以存储在插入和删除的表中找到的数据。

Declare @NewID varchar(50) = Replace(convert(Varchar(50),NEWID()),'-','')
Declare @SQLStr varchar(8000)
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from inserted'
Exec (@SQLStr)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:无效的对象名称“插入”

我知道我可以做到:

Select * into #inserted from inserted
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from #inserted'
Exec (@SQLStr)
Run Code Online (Sandbox Code Playgroud)

但是我不想使用 TempDB,因为这些表会变得很大,而且我也觉得它是多余的。有没有办法避免创建#inserted?

trigger sql-server dynamic-sql sql-clr

7
推荐指数
1
解决办法
5760
查看次数

堆是一个没有索引的表还是没有聚集索引?

BOL 似乎将堆定义为没有聚集索引的表。

但是许多在线帖子似乎将堆等同于没有任何索引的表。

有什么我不知道的微妙之处吗?

谢谢

index sql-server clustered-index heap nonclustered-index

7
推荐指数
1
解决办法
1723
查看次数

什么时候主键才有意义?

请原谅这里任何定义的松散,但我试图探索一个简单的概念。

一个主键唯一标识一行。表中可能还有其他列具有唯一值,因此它们也可以唯一标识一行(候选键),但主键是为任务指定的。

使主键更有用的属性包括:

  • 保证是唯一的;随着表的增长,其他一些唯一的列值可能会重复
  • 不太可能改变;虽然外键约束可以包括级联,但最好不要要求这个
  • 不会被回收;由于某种原因被删除的行不应释放旧的 PK 值以供重用

由于这些原因,我通常建议主键没有内在价值,因此永远没有理由更改或回收值。也就是说,它应该是没有意义的

我见过包含某种代码的主键,例如基于名称的客户端代码。明显的问题是 (a) 如果客户端名称更改,那么 PK 也应该更改,以及 (b) 与具有相似名称的客户端发生冲突的风险太大。

半个例外是使用自动递增的数字,它具有序列号的次要含义。但是,它仍然很稳定。

问题是,在什么情况下,如果有的话,最好使用具有其他实际含义的主键?也就是说,PK应该是任意的,并且你通常可以通过序列号获得的建议有什么问题吗?

database-design primary-key candidate-key

7
推荐指数
1
解决办法
3370
查看次数

如何将整个数据库备份到文本文件

如果它很愚蠢并且有效,那它仍然是愚蠢的。

关于 GDPR 的喧嚣让我思考 - 如果您必须进行备份并修改/删除数据,您会怎么做?破解打开 .bak 文件对我来说听起来很难。但是打开一个 .txt 文件很容易。

我可以将我的数据库备份到文本文件中,从而更轻松地从备份中删除历史记录吗?

sql-server backup export scripting

7
推荐指数
1
解决办法
2642
查看次数

未知,由于内存压力,AppDomain 66 (master.sys[runtime].65) 被标记为卸载

我偶尔会在 SQL 错误日志中注意到这个错误:

由于内存压力,spid20s,Unknown,AppDomain 79 (master.sys[runtime].78) 被标记为卸载。

我正在使用 SQL Server 2016,SP1 CU5(我正在推动修补,但公司拒绝)。

我读过的所有内容都指向非 CLR 特定的内存压力。有关于更改MemToLeave启动参数中的设置的建议。对于较新版本的 SQL Server,这仍然是这种情况,还是有其他建议?

sql-server sql-clr error-log sql-server-2016

7
推荐指数
2
解决办法
2295
查看次数

重复的 NVARCHAR 值是否作为副本存储在 SQL Server 中?

我正在设计一个包含很多行的表。所以需要注意不要存储太多信息。其中一列是 NVARCHAR(MAX) 列,它包含我们客户的地址。由于地址不经常更改,此列将包含许多重复值,因此包含相当多的冗余。

所以我想知道我是否需要通过维护某种查找表来解决字符串来规范化(请注意,如果地址发生变化,我需要维护历史记录 - 所以这不是通常的规范化问题),或者如果 SQL Server指向幕后字符串的相同引用。或者它可能提供了一个列选项来这样做。我想到的另一种方法是使用 COMPRESS,但我想这没有意义,因为数据本身(即地址)不长。

读/写性能不是那么重要,因为数据会随着时间的推移而累积。

database-design sql-server azure-sql-database slowly-changing-dimension

7
推荐指数
4
解决办法
967
查看次数

唯一字段的 Guid 与整数 ID

这真的是一个笼统的问题。

假设我有一个单一写入 DB 和多个读取 DB 复制从属的复制模式 - 我不必将 GUID 作为我的唯一 ID 字段。这是一个正确的假设吗?

如果我有多个数据库实例,其中所有实例都可写并且它们之间同步,则唯一 ID 字段中的 GUID 是强制性的。这也是正确的吗?

我正在 Amazon RDS 上设置 PostgreSQL。

谢谢。

postgresql uuid amazon-rds

6
推荐指数
1
解决办法
885
查看次数

如何查找具有多个连续大写字符的值

对于我正在处理的项目,我需要识别大写不正确的值。

例如,我需要它来识别以下类型的值:

Mr JOHN Smith
MR John Smith
Mr John SMITH
Mr JOhn Smith
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的想法:

Select * from table where Name = upper(Name) 
  collate SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)

(它给出了全部大写的行的结果,例如 MR JOHN SMITH)

Select * from table where right(Name,3) = upper(right(Name,3)) 
  collate SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)

它也拾取了一些行。

但我怀疑这是解决此问题的最有效方法。

sql-server collation t-sql sql-server-2014 unicode

6
推荐指数
1
解决办法
3632
查看次数

如何判断我在通过 Windows 身份验证登录时使用了哪个 Windows 组登录名

我创建了两个对应于两个 Windows 组的 SQL Server 登录名:

MachineName\MyAppAmdin
MachineName\MyAppUser
Run Code Online (Sandbox Code Playgroud)

然后在数据库中,我创建了两个具有相同名称的用户并将它们映射到登录名。

在 Windows 服务器中,我将我的域帐户添加MyDomain\MyAccountMachineName\MyAppAmdin组中。

现在我可以通过 Windows 身份验证通过MyDomain\MyAccount.

问题是,我想确切地知道我正在使用哪个 Windows 组登录,但我不知道如何。

我试过:

ORIGINAL_LOGIN()
SYSTEM_USER
SUSER_SNAME
SELECT * FROM dm_exec_sessions
Run Code Online (Sandbox Code Playgroud)

以上所有内容都会返回MyDomain\MyAccount,但我需要知道的是我是否通过MachineName\MyAppAmdin.

总结一下,我的问题是:

有没有办法准确判断当前连接使用的是哪个 Windows 组登录(或用户)?

或者有什么方法可以检查是否MyDomain\MyAccount与特定用户或登录名相关联?

我知道我可以使用 C# 或命令来解析域帐户是否属于特定的 Windows 组,但是我们有一些新的 IT 策略,所以我正在考虑使用 TSQL 实现类似结果的方法。

security sql-server t-sql sql-server-2012 logins

6
推荐指数
1
解决办法
2555
查看次数