小编Sol*_*zky的帖子

将 Unicode 转换为非 Unicode / NVARCHAR 到 VARCHAR 时的自动转换

Unicode代码点9619是一个叫“深色”字符:?http://unicode-table.com/en/search/?q=9619)。

使用SQL_Latin1_General_CP1_CI_AS排序规则和 1252 代码页,我希望将该 Unicode 字符转换/转换为非 Unicode 数据类型会导致问号 ( ?),因为代码页 1252 似乎不包含此字符,这似乎是 SQL Server 的无法进行转换时的行为。

所以我的问题是:为什么 SQL Server 将此字符转换为 ASCII 代码 166,即“管道,垂直竖线”:¦

SELECT NCHAR(9619), CAST(NCHAR(9619) AS CHAR(1)), ASCII(CAST(NCHAR(9619) AS CHAR(1)))
Run Code Online (Sandbox Code Playgroud)

sql-server collation encoding unicode

8
推荐指数
2
解决办法
4470
查看次数

设置 TRUSTWORTHY On 使服务代理停止工作

我有一个在 SQL-Server 2012 DBMS 上运行的数据库。考虑到运行 SQL Server 的服务器不是网络域的一部分。当我执行这个 sql 命令时

ALTER DATABASE myDatabase SET TRUSTWORTHY ON;
Run Code Online (Sandbox Code Playgroud)

服务代理队列(早期设置和工作)接收消息,但与队列关联的活动存储过程没有启动。消息继续流入队列,但没有其他任何事情发生。在 SQL SERVER 日志中,我发现了这条消息

在队列“proofSCHEMA.myQueue”上运行的激活过程“proofSchema.mySP”输出以下内容:“主数据库中记录的数据库所有者 SID 与数据库“myDatabase”中记录的数据库所有者 SID 不同。您应该通过使用 ALTER AUTHORIZATION 语句重置数据库“myDatabase”的所有者来纠正这种情况。

如果我在网络域内的机器上运行相同的配置,则一切正常。

我不明白发生了什么以及为什么值得信赖的使用服务代理队列。

security sql-server service-broker sql-server-2012

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

行计数显示在对象资源管理器详细信息上所需的权限

我有一个奇怪的安全问题。我有一个用户在 SQL 2016 服务器上使用 SSMS 18.2。他们是 db_datareader 的成员,但是当他们在 Object Explorer Details 中拉出Row Count列时,它是空白的。尽我所知,它需要 DBO 才能显示行数。

具有读取权限的用户: 在此处输入图片说明

具有 dbo 访问权限的用户: 在此处输入图片说明

这是一个错误还是故意的?有谁知道是否有较低级别的权限可以提供此行数?我知道有很多其他方法可以获得行数,例如sys.partitions,但是用户坚持认为他们想要使用 OED 窗口。

sql-server permissions ssms sql-server-2016

8
推荐指数
1
解决办法
249
查看次数

在数据库和实例之间共享密码加密的证书

题:

我正在尝试创建一个(自签名)证书并跨多个数据库和实例进行部署。

我创建和备份证书:

USE MASTER
CREATE CERTIFICATE DavesCert ENCRYPTION BY PASSWORD ='S3creT!' WITH SUBJECT = 'The master cert'

BACKUP CERTIFICATE DavesCert TO FILE = 'd:\DavesCert.cer' 
WITH PRIVATE KEY ( DECRYPTION BY PASSWORD = 'S3creT!' ,
FILE = 'd:\DavesCert.pvk' , 
ENCRYPTION BY PASSWORD = 'S3creT!' );
Run Code Online (Sandbox Code Playgroud)

我用

USE FOO
GO

CREATE CERTIFICATE ERecruitStatsGatheringCert       
FROM FILE = 'd:\DavesCert.cer'      
WITH PRIVATE KEY (FILE = 'd:\DavesCert.pvk', 
DECRYPTION BY PASSWORD = 'S3creT!')
Run Code Online (Sandbox Code Playgroud)

并收到以下错误:“请在数据库中创建主密钥或在执行此操作之前在会话中打开主密钥。”

我不想创建数据库主密钥。我很高兴根据需要通过密码解密证书。

背景: SaaS 应用程序。数据库和实例之间的多对多关系。

我需要每个数据库都能够通过执行一个存储过程来查询它自己的统计信息,该存储过程包含对 DMV 的一些调用以返回统计信息。

应用程序在低权限帐户下运行。DMV 需要 VIEW SERVER STATE …

sql-server-2005 security sql-server signature certificate

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

将 COLLATE 与 UNION 结合使用

怎么COLLATEUNION?我想合并 2 个表(都具有相同的列和相同的类型:)varchar,int, int, decimal

我收到以下错误:

sg 468, Level 16, State 9, Line 1 无法解决 UNION 操作中“Serbian_Latin_100_CI_AS”和“Croatian_CI_AS”之间的排序冲突。

我的 SQL 语句:

select * from #IA_BIH
union 
select * from #IA_MNE  
Run Code Online (Sandbox Code Playgroud)

我应该在哪里插入collate database_default?我尝试了不同的组合,但没有奏效。

sql-server collation t-sql union

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

无法从 NVARCHAR 列中删除字符 0x0000

所以,我知道所有关于 Replace 函数和 char(0) 的错误。

我有一列 ( NVARCHAR(128)) 有一些NCHAR(0x0000)来自错误导入的字符。

我正在使用 SQL Server 2008 R2。

该列的排序规则是:SQL_Latin1_General_CP1_CI_AS

我已经尝试了所有可能在网上找到的东西,但没有任何东西可以从列中取出臭气熏天的 char(0) 字符。

这是我的最新尝试,结果是 BAFFLING(sql server 中的错误?)。

我有一个循环遍历每个字符并用特定字符替换 0x0000 的函数。

ALTER FUNCTION dbo.ReplaceCharZero
(
  @testString NVARCHAR(MAX),
  @charToReplaceWith NCHAR(1) = ' '
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE
        @i INT = 1 ,
        @fixedString NVARCHAR(MAX) = ''
    WHILE @i <= LEN(@testString)
        BEGIN
            IF SUBSTRING(@testString, @i, 1) = CHAR(0x00)
                BEGIN
                    --PRINT 'Found' + CAST(@i AS VARCHAR)
                    SET @fixedString = @fixedString + @charToReplaceWith …
Run Code Online (Sandbox Code Playgroud)

sql-server collation sql-server-2008-r2 unicode

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

在表中存储日语字符

我正在使用 SQL Server 2008 R2 并且我想将日语字符存储在我的表的列之一中。

说我想存储日语名字,我怎样才能做到这一点?有没有简单的方法?

sql-server collation unicode

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

触发器 - 在动态 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
查看次数

什么时候主键才有意义?

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

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

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

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

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

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

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

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

database-design primary-key candidate-key

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

未知,由于内存压力,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
查看次数