SQL Server 2017 将 Python 实例安装到“C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES”(文档链接),用于 Python 调用。它与 SQL Server 与 Python 通信所需的特定包一起安装。
是否有关于这些包的文档、将它们拉到哪里(pip?)以及如何将 SQL Server 指向同一服务器上不同的 Python 安装?
对于一个最小的工作示例,假设我有一个存储 JSON 的列,其结构类似于以下内容。
DECLARE @json NVARCHAR(4000) =
'{"Dims":
[
{"Name":"Apple", "Baking": ["Pie","Tart"], "Plant":"Tree"},
{"Name":"Tomato", "Cooking":["Stew","Sauce"], "Plant":"Vine"},
{"Name":"Banana","Baking":["Bread"], "Cooking":["Fried"], "Plant":"Arborescent"}
]}
'
这是有效的 JSON,并且可以返回标量。
SELECT ISJSON(@json);
1
SELECT JSON_VALUE(@json,'$.Dims[0].Name');
Apple
但是,当我使用JSON_QUERY
返回所有"Dims"
SQL Server 2017 错误的名称时。
SELECT JSON_QUERY(@json,'$.Dims[*].Name');
Msg 13607, Level 16, State 4, Line 16 JSON path is not properly formatted. Unexpected character '*' is found at position 7.
这应该返回
["Apple", "Tomato", "Banana"]
这是一个有效的标准 JSON 路径。任何想法为什么这不起作用以及如何让它在 SQL Server 2017 上工作。
尽管盲目地创建建议的缺失索引不太理想,有没有办法从 SQL Server Management Studio 的“执行计划”选项卡中复制和粘贴建议的缺失索引?
您会在鼠标悬停在其上时获得工具提示,但似乎没有右键单击菜单复制它们。多年来,我只是输入了我需要的任何内容,但很好奇是否可以从选项卡中轻松获取基本表单。
使用 SSMS 2017
我正在使用 SQL Server 2016,我正在使用的数据具有以下形式。
CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1));
INSERT INTO #tab VALUES
('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL),
('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL);
SELECT *
FROM #tab;
我想获得列上的最后一个非空值,val1
并按val2
分组cat
和排序t
。我正在寻找的结果是
cat val1 val2 A 1 P B 10 C
我最接近的是使用LAST_VALUE
,而忽略ORDER BY
which 不起作用,因为我需要排序的最后一个非空值。
SELECT DISTINCT
cat,
LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1,
LAST_VALUE(val2) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val2
FROM #tab
cat val1 val2 A NULL NULL B 10 NULL
实际的表有更多的列cat
(日期和字符串列)和更多的 val 列(日期、字符串和数字列)来选择最后一个非空值。
任何想法如何进行此选择。
我使用过 T-SQL(CTE、窗口函数、递归 CTE、大数据、表值函数、APPLY、PIVOT、存储过程等),但从未查询过 Microsoft SSAS 多维数据集。
对于以下 T-SQL 概念,MDX 中是否有类似的概念?
使用 MDX 的 T-SQL 用户有什么陷阱吗?
我希望 T-SQL 和 MDX 之间有一些共同的类比,这将帮助擅长 T-SQL 的人过渡到 MDX。
如果有关于从 T-SQL 到 MDX 时常见错误的指南,那就太好了。
在 SQL Server 数据库sp_recompile
上可以运行一个存储过程来更新执行计划。我想在数据库中的所有存储过程上运行它。另外,我想在所有表值函数上运行它的等价物,但我不知道要运行哪个 sys 过程。
是否可以在不sp_recompile
为 SQL Server Management Studio 中的所有存储过程名称手动输入一行的情况下执行此操作?同样对于表值函数?
我相信我需要这样做,因为 VM SQL Server 的内存显着增加,但我只看到执行时间略有增加。执行计划显示 80% 以上的运行时间是在聚集索引搜索上,所以我认为我无法做更多的事情来优化存储过程。
我有几个 SQL 对象需要根据请求的所需状态采取替代操作。有没有办法创建可以传递给存储过程、表值函数并在查询中使用(不使用 CLR)的数据库级常量(枚举)?
CREATE PROCEDURE dbo.DoSomeWork(@param1 INTEGER, ..., @EnumValue myEnumType) AS ...;
然后使用它:
EXEC doSomeWork 85, ..., (myEnumType.EnumValue1 + myEnumType.EnumValue2);
哪里myEnumType
会保存一些枚举值。
在此过程中,我将能够使用@EnumValue
它并针对值进行测试myEnumType
以完成所需的工作。我会myEnumType
为我正在考虑的情况设置位掩码的值。
举一个简单的例子,考虑一个昂贵的过程,它需要一个巨大的数据集并将其缩减为一个更小但仍然非常大的数据集。在此过程中,您需要在该过程的中间进行一些调整,这将影响结果。假设这是基于减少中中间计算的某些状态来过滤(或反对)某些类型的记录。@EnumValue
of 类型myEnumType
可以用来测试这个
SELECT ...
FROM ...
WHERE (@EnumValue & myEnumType.EnumValue1 = myEnumType.EnumValue1 AND ...)
OR (@EnumValue & myEnumType.EnumValue2 = myEnumType.EnumValue2 AND ...)
OR ...
在不使用 CLR 的情况下,这些类型的数据库级别常量是否可以在 SQL Server 中使用?
我正在寻找可以作为参数传递给存储过程、函数等的数据库级枚举或一组常量。
我有一些带有以下列的平面文件;3 个整数、3 个实数和 1 个 varchar(20)。对于查询,我需要一个包含 1 个整数列和 varchar 列的索引。每个文件大小约为 1.8GB,行数约为 3800 万。
目前我正在使用 HSQL(Standalone) 数据库来加载文件进行处理;每个文件一个数据库。当使用以下选项创建数据库时,加载文件非常慢(120+ 分钟)并导致 4.7GB 的数据库文件。
"Properties" -> {
"check_props" -> "true",
"shutdown" -> "true",
"hsqldb.default_table_type" -> "cached",
"sql.syntax_mss" -> "true",
"hsqldb.log_data" -> "false",
"hsqldb.inc_backup" -> "false"
}
该文件分批读取 100k 条记录。阅读速度非常快(几乎是即时的),所以我不认为是阅读让事情变慢了。关闭与数据库的连接也需要很长时间。
我可以选择使用 Derby、H2 或 SQLite。在这种情况下,这些是否会导致更快的加载时间和/或更小的数据库文件大小?如果是这样,应该使用哪些连接字符串选项来实现此目的?或者,是否有不同的连接字符串选项可以与 HSQL(Standalone) 一起使用,以减少加载时间和/或数据库文件大小?
添加了驱动程序信息。
JDBCDriver[
"Name" -> "HSQL(Standalone)",
"Driver" -> "org.hsqldb.jdbcDriver",
"Protocol" -> "jdbc:hsqldb:file:",
"Version" -> 3.1,
"Description" -> "HSQL Database Engine (In-Process Mode) - Version 2.3.3 - This ...",
"Location" -> "C:\... "]
我可用的其他选项的驱动程序信息。
德比
JDBCDriver[
"Name" -> "Derby(Embedded)",
"Driver" -> "org.apache.derby.jdbc.EmbeddedDriver",
"Protocol" -> "jdbc:derby:",
"Version" -> 3.1,
"Description" -> "Derby Database Engine (Embedded Mode) - Version 10.12.1.1 - This...",
"Location" -> "C:\... "]
H2
JDBCDriver[
"Name" -> "H2(Embedded)",
"Driver" -> "org.h2.Driver",
"Protocol" -> "jdbc:h2:",
"Version" -> 3.1,
"Description" -> "H2 Database Engine (Embedded Mode) - Version 1.3.176 - This...",
"Location" -> "C:\... "]
SQLite
JDBCDriver[
"Name" -> "SQLite",
"Driver" -> "org.sqlite.JDBC",
"Protocol" -> "jdbc:sqlite:",
"Version" -> 3.1,
"Description" -> "SQLite using Zentus-derived JDBC Driver - Version 3.8.11.2",
"Location" -> "C:\..."]
其他变体包括以下内容。但是,我需要它在客户端的计算机上运行。我相信这不包括服务器和网络服务器模式。
{"Derby(Embedded)", "Derby(Server)", "H2(Embedded)", "H2(Memory)",
"H2(Server)", "HSQL(Memory)", "HSQL(Server)", "HSQL(Standalone)",
"SQLite", "SQLite(Memory)"}
我记得 SQL Server(可能是 2014 版,但也可能是 2016 版)添加了创建数据库级计数器(身份字段?)的功能。有点像数据库级别的 IDENTITY 函数。我不记得他们如何称呼这些计数器,所以在帮助中找不到它们。
这些计数器叫什么,我如何创建一个?
请注意,我不是在谈论创建一个带有标识列的表并滚动一个标量值函数来返回它。我指的是一个内置功能,但我不记得它的名字了。
是否有一个命令可以完全克隆表的模式?这将包括表上的所有约束、外键和索引。
在 SSMS 中,脚本表为 | 创建到菜单命令不包括在表上定义的索引。
我有一个使用导入向导从 CSV 导入的大表。我有一个从该表中选择的查询,并将所有字符串“代码”列替换为来自其他维度表的整数 ID,并对其他一些列执行一些转换。这一切都很好。
我需要将此查询的结果插入数据库中具有所需外键链接和索引的表中。这也是 SQL 对象(存储过程、函数、视图)用来访问数据的表。
我的问题是插入需要永远(1.2 小时)才能最终因抱怨事务日志的大小而死亡。我无权登录服务器。我只能通过 SSMS 访问相关数据库的 db_owner 权限。
我的问题是:
BULK INSERT
,OPENROWSET(BULK ...)
但是这些需要一个文件。在 SQL Server 2016 中,我有一个场景,其中数据将根据大型GROUP BY ROLLUP
. 我想要一个存储过程,它有一个参数,该参数指定使用哪个聚合函数来以不冒 SQL 注入风险并利用编译的方式描述分组(这是一个繁重的存储过程)。
我的想法是使用一组查询来总结数据在特定聚合函数上的分组。(例如 agg.DataMin、agg.DataMedian、agg.DataWeightedAverage 等)。然后将这些与 CTE 中的参数一起使用
WITH AggData AS
(
SELECT * FROM agg.DataMin WHERE @AggFunction = 1
UNION ALL
SELECT * FROM agg.DataMedian WHERE @AggFunction = 2
UNION ALL
SELECT * FROM agg.DataWeightedAverage WHERE @AggFunction = 3
)
SELECT ...
我关心的是查询性能和行业最佳实践。数据表大小合理 (2+ Gig)。我将不得不为一些遗漏的聚合添加许多聚合查询,其中一些是内联表值函数。
上面的查询/表值函数是只在@AggFunction
满足WHERE
条件时执行,还是在返回结果后全部执行过滤?如果是后者,是否有一种方法可以在运行时缩短对不需要的查询的评估?另外,是否有一些我忽略的在 SQL 中执行此操作的标准方法?