小编Sol*_*zky的帖子

SQL Server 大容量插入正确解释某些 Unicode 字符而不是其他字符?

出于某种原因,MS SQL Server 2016 批量插入会误解/翻译 Unicode 字符:

  • C9 (É) 变成 2B (+)
  • A1 (¡) 到 ED (í)
  • A0 ( ) 到 E1 (á)
  • AE (®) 到 AB («)
  • CB (Ë) 到 2D (-)
  • D1 (Ñ) 到 2D (-)
  • 92 (') 到 C6 (Æ)
  • 96 (–) 到 FB (û)

即 Notepad++ 和 xxd 显示平面文件有 0xC9,但在批量插入后,表显示“+”,并在 SQL Server 中转换为 varbinary 显示为 0x2B。备份也有 0xC9。

我正在向 MS SQL Server 2016 中批量插入 25 个平面文件。它是 15Gb 数据,我正在使用管道 ( | ) 字段分隔符和CRLF行分隔符。

我批量插入到我提供的备份的截断结构中。当我与备份进行比较时,存在差异。注意:我必须等待 25 小时才能从数据源备份,但可以在 …

sql-server collation encoding unicode bulk-insert

5
推荐指数
1
解决办法
6181
查看次数

使用默认命名空间和不一致的根节点解析类型化 XML

我有一个结构化的、类型化的 xml 文件。

<WebService xmlns="http://www.orbis-software.com/WebSvcCon">
 <NewLeads>
  <OutputSchema>
  <root xmlns="" type="array">
   <item type="object">
   <SaleProperty type="object">
    <Type type="string">Freehold</Type>
    <PostDistrict type="string">xxx</PostDistrict>
    <Address type="string">address</Address>
     <Value type="number">17.0</Value>
   </SaleProperty>
   <Transaction type="string">SaleOnly</Transaction>
   <Quote type="object">
    <Sale type="object">
     <Fees type="number">450.0</Fees>
     <Disbursements type="number">0.0</Disbursements>
     <StampDuty type="number">0.0</StampDuty>
     <Total type="number">450.0</Total>
    </Sale>
   <Discount type="number">0.0</Discount>
   <VAT type="number">90.0</VAT>
   <Total type="number">540.0</Total>
  </Quote>
  <MoverId type="number">12345678</MoverId>
  <Name type="string">Mr AS</Name>
  <Email type="string">as@yahoo.ppp</Email>
  <Telephone type="string">0123456789</Telephone>
  <Comments type="string">Joint ownership</Comments>
  <EstimatedMoveDate type="string">2015-11-25T05:57:00</EstimatedMoveDate>
  <Charge type="number">4.99</Charge>
  <ChargeStatus type="string">Chargeable</ChargeStatus>
 </item>
</root>
</OutputSchema></NewLeads></WebService>
Run Code Online (Sandbox Code Playgroud)

此外,对象 SaleProperty 可能会丢失,而可能是对象 PurchaseProperty。类似地,对象 Quote 可以包含 Sale、Purchase、Remortgage 对象或同时包含 Sale 和 Purchase 我找不到任何关于通过 SQL Server …

xml sql-server sql-server-2012 xquery

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

从性能的角度来看,来自应用程序的数据库连接是否昂贵?

一位同事告诉我,连接到数据库的成本很高,而且可能会损害应用程序的性能。他们让我创建一个调用另外 8 个过程的过程,这样他们调用一个过程并取回 8 个数据集。从我的角度来看,SQL 必须等待每个数据集返回,然后才能开始检索下一个数据集,这样也会产生负面影响。

任何人都可以量化应用程序的连接成本,并让我知道最好的方法是调用多个过程还是一个主过程?

performance sql-server-2008 sql-server connection-pooling connections

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

多命令SQLCMD模式脚本

我正在尝试在 sqlcmd 模式下为表列表执行 sql 过程,以将所有输出重定向到每个表的一个文件中。

不幸的是,只有所有命令的重定向输出的最后一个文件才能获得内容。

例如,我执行以下操作:

:OUT  c:\test\tab0.sql 
 EXEC [dbo].[sp_generate_merge] @schema = 'dbo', @table_name ='tab0', @include_timestamp = 0, @ommit_images = 1, @CreateProcedure = 1
:OUT  c:\test\tab1.sql 
 EXEC [dbo].[sp_generate_merge] @schema = 'dbo', @table_name ='tab1' , @include_timestamp = 0, @ommit_images = 1, @CreateProcedure = 1
Run Code Online (Sandbox Code Playgroud)

两个文件都被创建,但只有最后一个文件获得所有内容。

任何提示我可以如何更改它以便在每个命令的一个文件中获得结果?

sql-server sql-server-2008-r2 sqlcmd

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

Nvarchar 到 varchar 到 nvarchar 字符的转换

我有一个表格,里面有一些希腊文本行,如nvarchar(2000).

最近,我将列的类型更改为 ,varchar(4000)但我意识到一些希腊字符显示为问号。

所以,我试图改回以nvarchar(4000)修复它,因为我认为字符的 unicode 仍然保持不变。

我只是想知道,有没有办法解决这个问题,而不是在更改表之前恢复我创建的备份?

sql-server collation alter-table encoding unicode

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

模拟用户或登录映射到证书

假设在数据库中创建了一个证书

create certificate certName
    with subject = 'subj';
GO
Run Code Online (Sandbox Code Playgroud)

和映射到此证书的用户

create user userName
    from certificate certName;
GO
Run Code Online (Sandbox Code Playgroud)

试图直接冒充此用户

execute as user = 'userName';
GO
Run Code Online (Sandbox Code Playgroud)

execute as在模块的子句中指定用户

create procedure procName
with execute as 'userName'
as
    set nocount on;
GO
Run Code Online (Sandbox Code Playgroud)

返回错误

消息 15517,级别 16,状态 1 ...
无法作为数据库主体执行,因为主体“userName”不存在、无法模拟此类主体或您没有权限。

但是,我找不到文档中提到的这个限制(这里这里),唯一相关的声明似乎是

user_name 必须存在于当前数据库中并且必须是单例帐户。user_name 不能是组、角色、证书、密钥或内置帐户,例如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。

是否可以模拟映射到证书的用户(或登录)?

security sql-server signature certificate impersonation

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

什么时候 sp_OACreate 等。阿尔。被弃用?

我在支持的 SQL Server 实例上遇到了问题,许多 Stack 站点都提供了有关这些功能的信息,但大多数站点基本上都说“不要使用这些;它们已被弃用/有问题/有漏洞”。我将尝试针对我的特定问题实施变通办法,但我的问题是诸如sp_OACreate和 之类的功能何时sp_OAMethod被弃用?我必须向我的 Sys Admin 和老板解释这一点,以证明重写是合理的,而且我通过谷歌搜索并没有遇到太多(尽管我的搜索词可能很差)。

sql-server ole-automation

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

创建 CLR 程序集时,未授权程序集 PERMISSION_SET=UNSAFE

运行所有这些命令的登录名是sysadminSQL 2012 Developer 实例上服务器角色的成员。它是部署到的数据库的所有者。EXTERNAL ACCESS ASSEMBLY已授予此 DB 中的登录权限。还尝试了以下所有内容作为sa登录无济于事。

alter database test set trustworthy on
go
create assembly [icsharpcode.sharpziplib]
from 'C:\Workspace\111\icsharpcode-SharpZipLib-4f2d664\bin\Release\ICSharpCode.SharpZipLib.dll'
with permission_set = UNSAFE --< This works!
go
create assembly OutOfRowCompression
from 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
with permission_set = UNSAFE --< This fails!
go
Run Code Online (Sandbox Code Playgroud)

最后一个命令失败:

消息 10327,级别 14,状态 1,第 1 行 CREATE ASSEMBLY 为程序集“OutOfRowCompression”失败,因为程序集“OutOfRowCompression”未被授权用于 PERMISSION_SET = UNSAFE。当以下任一情况为真时,程序集被授权:数据库所有者 (DBO) 具有 UNSAFE ASSEMBLY 权限并且数据库具有 TRUSTWORTHY 数据库属性;或者程序集使用证书或非对称密钥签名,该密钥具有具有不安全程序集权限的相应登录名。

收到错误后,我使用新的非对称密钥对程序集进行了签名key1.pfx,并将其添加到主数据库中:

CREATE ASYMMETRIC KEY key1
FROM executable
FILE = 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
Run Code Online (Sandbox Code Playgroud)

验证密钥是否存在: …

sql-server compression sql-server-2012 sql-clr

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

为什么在某些情况下不替换 Unicode 字符?

正如预期的那样,在“测试”中运行此结果:

SELECT
    REPLACE(NCHAR(1234), NCHAR(1234), N'test');
Run Code Online (Sandbox Code Playgroud)

但是,运行此结果会生成“a?a”,其中没有“test”:

SELECT
    REPLACE(N'a' + NCHAR(1234) + N'a', NCHAR(1234), N'test');
Run Code Online (Sandbox Code Playgroud)

我认为这可能与 haystack 而不是针的字符串连接有关,但是当我尝试这样做时,它仍然没有“工作”:

SELECT
    REPLACE(N'a' + NCHAR(1234) + N'a', N'' + NCHAR(1234) + N'', N'test');
Run Code Online (Sandbox Code Playgroud)

结果:“a?a”

我怀疑这可能与它如何解释字符有关,所以我尝试指定一个二进制排序规则......并“修复”了这个问题:

SELECT
    REPLACE(N'a' + NCHAR(1234) + N'a' COLLATE Latin1_General_100_BIN2, NCHAR(1234), N'test');
Run Code Online (Sandbox Code Playgroud)

结果:“atesta”。

为什么?

这种行为似乎对某些角色存在,但对其他角色不存在。

SELECT
    REPLACE(N'a' + NCHAR(23423) + N'a', NCHAR(23423), N'test');
Run Code Online (Sandbox Code Playgroud)

结果:“atesta”(“作品”)

SELECT
    REPLACE(N'a' + NCHAR(5342) + N'a', NCHAR(5342), N'test');
Run Code Online (Sandbox Code Playgroud)

结果:“a?a”(不“工作”)

为什么?

sql-server collation t-sql unicode

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

创建数据库的存储过程的执行权限

我有一个存储过程,它为需要由我们的一位数据分析师每个月运行的特定项目创建一个数据库。问题是我如何构建它以使分析师能够在不授予他们创建数据库权限的情况下运行此存储过程。

我试过用 EXECUTE 作为 OWNER/USER_NAME

分析人员仍然收到以下错误:消息 262,级别 14,状态 1,第 67 行 CREATE DATABASE 权限在数据库“master”中被拒绝。

有什么建议吗?

security sql-server stored-procedures permissions impersonation

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