我正在尝试建立这个答案如何运行包含许多插入的大型脚本而不会耗尽内存?
而分手的查询与较小的BEGIN TRANSACTION,然后GO的
BEGIN TRANSACTION;
MERGE ghcnd.dbo.us_APCP as target
using
(values
('US1CASN0123','2018-03-22','--N','251'),
('US1KSGO0013','2018-03-22','--N','41'),
('US1WYFM0039','2018-03-22','--N','0'),
('US1SCCF0008','2018-03-22','--N','10'))
as source(cell,[date],valueFlag,[value])
on target.cell = source.cell
AND target.date = source.date
when matched then
update
set valueFlag = source.valueFlag ,
value = source.value
when not matched then
insert (cell,[date],valueFlag,[value])
values (cell,[date],valueFlag,[value])
COMMIT TRANSACTION; GO
Run Code Online (Sandbox Code Playgroud)
但是我收到这个错误
消息 102,级别 15,状态 1,第 3 行 ')' 附近的语法不正确。消息 102,级别 15,状态 1,第 3 行“GO”附近的语法不正确。
正如预期的那样,在“测试”中运行此结果:
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 解码 Base64,在网上搜索了许多解决方案(一些来自此处)后,似乎基于这种方法。
SELECT CAST(CAST('Base64StringHere' as XML ).value('.','varbinary(max)') AS VARCHAR(250))
Run Code Online (Sandbox Code Playgroud)
当我有 ASCII 文本时,这非常有效。但是,当我有以下法语文本时,它会损坏(大概是由于 VARCHAR 的限制)。
Où est le café le plus proche?
T8O5IGVzdCBsZSBjYWbDqSBsZSBwbHVzIHByb2NoZT8=
Run Code Online (Sandbox Code Playgroud)
并提供以下输出。
Où est le café le plus proche?
Run Code Online (Sandbox Code Playgroud)
我认为相对简单的解决方法是将 to 更改为CAST,NVARCHAR但这会再次导致损坏。
SELECT CAST(CAST('T8O5IGVzdCBsZSBjYWbDqSBsZSBwbHVzIHByb2NoZT8=' as XML ).value('.','varbinary(max)') AS NVARCHAR(250) )
????????????????
Run Code Online (Sandbox Code Playgroud)
我的搜索引擎技能可能让我失望,但我似乎找不到其他有我问题的人。
有什么想法吗?
从 SQL Server 2019 开始,它支持 UTF-8 作为排序规则。但是,根据以下查询:
SELECT COLLATIONPROPERTY('Arabic_100_CS_AS_KS_WS_SC_UTF8', 'CodePage')
SELECT COLLATIONPROPERTY('Latin1_General_100_CS_AS_KS_WS_SC_UTF8', 'CodePage');
Run Code Online (Sandbox Code Playgroud)
两者都返回65001Windows 中的 Unicode代码页。此外,所有新_UTF8排序规则都使用代码页65001:
SELECT * FROM sys.fn_helpcollations() WHERE name LIKE '%_UTF8';
Run Code Online (Sandbox Code Playgroud)
usingArabic_100_CS_AS_KS_WS_SC_UTF8和Latin1_General_100_CS_AS_KS_WS_SC_UTF8as 排序规则之间有什么区别吗?
我有一个带有被动节点和主动节点的 SQL Server 2008 R2 故障转移群集。服务器在物理上是相同的。我有两个 SQL Server 实例,一个设置为使用前 3 个 NUMA 节点中的所有 CPU,另一个设置为使用第 4 个 NUMA 节点中的所有 CPU。
这似乎工作正常,即使发生故障转移,但这是一个坏主意吗?
如果无源服务器没有那么多处理器,故障转移会发生什么?
我正在将不同来源的平面文件导入 SQL Server 中的表中。我正在使用提取中的字段组合创建一个复合主键,这些字段将为我的每一行提供一个唯一的键。
我现在的做法是从 1 个字段开始,然后继续连接字段,直到找到对所有记录都是唯一的键。这可能有点耗时,或者我最终可能会连接比我真正需要的更多的列以获得唯一键。
是否有某种 SQL 脚本可以在表上运行,它会给我最少数量的字段(名称),我需要连接以获得唯一键?因此,如果表中有 1 个字段对所有记录都是唯一的,则将返回该 1 个字段名称。如果我需要连接 [memberid]、[claimid] 和 [date of service] 以获得唯一键,那么这 3 个字段名称将是脚本的结果。
我正在将一个 SQL 表/列中的值插入到另一个中。由于其他原因,这些列的数据类型不同,但我不明白为什么 nvarchar(10) 源和 char(10) 目标有时会在 SQL Server 2014 中导致错误:
字符串或二进制数据将被截断。
len(sourcecol) = 10 和 datalength(sourcecol) = 20。
可能是因为 nvarchar 类型的源列中存储了一些不可见的空格/字符?
在 Microsoft SQL Server (2014) 中,可以在不区分大小写和区分大小写的排序规则之间进行选择。
我使用区分大小写的排序规则的原因是"test" = "TEST"return false。
然而,我想保留的是,当表"TEST"存在时,编写类似的查询select * from test;仍然有效。当数据库有区分大小写的排序规则时,它不会,因为我需要像这样写select * from TEST;
有没有办法分别设置“对象整理”和“字符串整理”?
该场景是一个 SQL Server 实例,一个主要使用 BULK INSERT 操作提供数据的数据库,并且插入的一些文本包含特殊字符,例如\xc3\xb1因为我在西班牙语环境中工作。
因此,在最初的小测试之后,我意识到当我运行简单的时,这些特殊字符没有正确显示select,所以我开始检查我能想到的所有内容:
select collation_name from sys.databases where name='DBNAME';结果为SQL_Latin1_General_CP1_CI_AS\n\n通过这些测试,我得出结论,数据未正确存储,这就是数据未正确显示和导出的原因。我在互联网上找到的几乎每个解决方案都建议使用nvarchar而不是varchar字符串数据类型字段,但这并不能解决这种情况。是什么破坏了我的插入?
SSMS 中有许多允许过滤的地方,例如对象资源管理器和分析器,但这些都将过滤器视为区分大小写,否则没有可见选项,因此如果您搜索,contains 'ASDF'则包括“ASDF_MyEntity”之类的值,但“asdf_MyEntity” "省略。
例如,我们在大型服务器上有很多SQL 代理作业,我正在尝试使用对象资源管理器按项目名称过滤它们,我们总是在作业名称前加上前缀。但是,这些显示为大写和小写变体。
另一个用例是在数千个条目中搜索与模块相关的存储过程。如果命名不一致(例如 PascalCase 与 camelCase),过滤搜索将忽略它。这对于调试来说似乎是一个不必要的幻象危险。
此外,对象资源管理器中的排序将每种类型的实体(例如表名、存储过程、作业名称等)的大写变体放在小写之前(因此大写Z在小写之前a),所以我要么必须滚动很多,或检查两个不同的过滤器(如果不是全部大写或全部小写字母,则检查更多过滤器 -准确地说是2 len(name)次)。
我意识到我只能手动查询作业、表和其他实体,但鉴于 SSMS 存在,这样做是荒谬的,因为它的名称是“SQL Server Management Studio”。
我可以做些什么来使 SSMS(和 SQL Server Profiler)像其他所有 Windows 应用程序一样忽略大小写?也许我可以在本地更改排序规则设置?
另外,为什么微软在实施 SSMS 时做出这个决定?我发现它只是有害的。
此外,SSMS 的加载初始屏幕显示“基于 Visual Studio 构建”,这会忽略解决方案资源管理器中的大小写。
PS 使用 SSMS 2014(版本 12.0.5214.6)。我无法进行任何服务器端更改,并且我的本地开发环境应与目标服务器环境匹配以进行测试。
sql-server ×10
collation ×6
unicode ×4
encoding ×3
bulk-insert ×1
clustering ×1
cpu ×1
import ×1
merge ×1
primary-key ×1
scripting ×1
ssms ×1
t-sql ×1
utf-8 ×1