我应该使用哪种数据类型来存储 11 位数字?它必须存储“0”作为第一个数字。
例如,如果我存储02421402015,它必须显示02421402015。我尝试使用varchar,它显示2421402015.
我正在尝试清理一个丑陋但可以完成工作的查询。我想知道是否可以在 SELECT 语句中创建一个临时变量。我已经谷歌搜索并没有找到任何帮助。基本上我对查询所做的是将 DateTime 字段与当前时间进行比较,以查看日期是过去还是将来。也许我把一些简单的事情复杂化了,但是从互联网上环顾四周,这似乎是比较 DateTime 字段的唯一方法。
我希望能够重用查询的以下重复部分,因为我必须将它们列出两次才能获得下限值:
(CAST(DATEADD(n, bq.markupDelay, sr.lastviewed) AS FLOAT)
Run Code Online (Sandbox Code Playgroud)
和
(CAST(GETDATE() AS FLOAT)
Run Code Online (Sandbox Code Playgroud)
这是查询:
SELECT
bq.quoteID
, bq.unsentNumber
, bq.sendSubsequent
, bq.unsentDelay
, sr.contractorID
, CASE
WHEN (CAST(DATEADD(n, bq.markupDelay, sr.lastviewed) AS FLOAT) - FLOOR(CAST(DATEADD(n, bq.markupDelay, sr.lastviewed) AS FLOAT))) <= (CAST(GETDATE() AS FLOAT) - FLOOR(CAST(GETDATE() AS FLOAT)))
THEN 1
ELSE 0
END AS 'Add Bid'
, DATEADD(n, bq.markupDelay, sr.lastviewed) AS 'Send Time'
, GETDATE() AS 'Time Now'
, e.email
, e.name
FROM tblCustomerBidQueue bq
INNER JOIN tblServiceRecords …Run Code Online (Sandbox Code Playgroud) 我有一列值保存为十六进制。
当我运行此查询时:
select column from table
where column like '%22639935-KCN%';
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
0x24000000008B010000000089FF32323633393933352D4B434E000000
Run Code Online (Sandbox Code Playgroud)
我想将输出转换为 varchar。这应该给我一个类似于 like 语句中的值。
到目前为止,我的尝试是:
SELECT CONVERT(VARCHAR(MAX),
0x24000000008B010000000089FF32323633393933352D4B434E000000)
SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX),
'0x24000000008B010000000089FF32323633393933352D4B434E000000', 2))
Run Code Online (Sandbox Code Playgroud)
但是,我得到了这个结果:
$
如何将此十六进制值转换为 varchar?
我知道 last_run_date 和 last_run_time 存储为 Int,但是当转换到 datetime(我有示例)时,是 GMT 时间还是什么?转换后,它与 GUI 日志历史记录显示的时间不匹配。
任何人都可以提供这方面的指导吗?
这是我将值转换为日期时间值的 t-sql 代码:
'last run literal' = dateadd(millisecond,
sjs.last_run_time,
convert(datetime,cast(nullif(sjs.last_run_date,0) as nvarchar(10))))
Run Code Online (Sandbox Code Playgroud) 我正在执行以下命令以从 SQL Server 中的存储过程中停止远程服务器上的服务。
----------------
-- Stop Service
----------------
SET @Command = 'sc \\' + @Server + ' stop ' + @ServiceName;
EXEC master.dbo.xp_cmdshell @Command;
Run Code Online (Sandbox Code Playgroud)
根据服务,有时这会成功执行,但有时我会收到以下错误:
[SC] OpenService FAILED 5:
NULL
Access is denied.
NULL
NULL
Run Code Online (Sandbox Code Playgroud)
我很好奇什么用户执行命令。是我登录/连接到数据库的用户吗?或者是我登录物理服务器的用户?我可以通过不同的身份验证xp_cmdshell吗?
我试图从一个表中检索数据,其中有项目代码,由前三个数字标识,其余的都是唯一的。因此,例如,查询是:
SELECT * FROM
TableA
WHERE LEFT(acccode,3) IN ('121','131','141','151','161')
Run Code Online (Sandbox Code Playgroud)
现在,我希望这个条件对于所有这些代码都成立,除了一个。说,对于第一个,我希望它看起来像“121-111%”这样的四个字符。我如何才能在那里更改我的IN操作员,或者我是否必须LIKE使用类似以下内容的操作员:
SELECT * FROM
TableA
WHERE acccode LIKE '121-111%'
OR acccode LIKE '131%'...
Run Code Online (Sandbox Code Playgroud)
等等...?
澄清一下:以 121-111、131、141、151、161 开头的代码是我想要选择的代码。
所有列都是nvarchar.
我目前正在管理 SaaS 系统的服务器集群。我们目前有 6 个运行 MSSQL 2008 R2 的 SQL 服务器。每台服务器都是一个四核虚拟机,在服务器机架上提供 16GB 的 RAM。我们使用 SQL Server 允许的最多 50 个实例填充每个服务器。每个实例将被最多 10 个客户端同时偶尔访问,并且每个数据库的大小通常只有 100MB 到 500MB 左右。
目前,每个实例都是在没有设置内存限制的情况下安装的,但我们发现第一个实例往往会使用过多的内存,而后面的实例(按启动顺序)只有 200MB 可用,而服务器操作系统的内存不足1% 的物理内存可用。这似乎会导致过度的磁盘交换和延迟问题。
在这种情况下拆分内存分配的推荐方法是什么?是否有一个公式可以根据客户端数量和数据库大小来确定一个实例至少需要多少内存?我可以为每个实例设置最大 300MB 并完成它吗?
我终于想出了如何配置看起来非常稳定并且在所有实例中完全对称的所有内容,并且由于它需要进行一些挖掘和操作,因此我认为我应该分享我的解决方案。这可能并不适合所有人,但对我来说似乎是最好的解决方案。
关键在这个 API:https : //docs.microsoft.com/en-us/windows/desktop/api/memoryapi/nf-memoryapi-setprocessworkingsetsizeex
这允许您在每个进程的基础上设置最小和最大工作集大小的硬限制。这对我来说似乎是最干净的,因为它允许我告诉 SQL Server 在这个工作集大小内使用它想要的尽可能多的内存,并且它似乎自己进行了充分优化,而不是满负荷运行并试图占用更多内存每时每刻。每个实例将交换更多的整体,但由于每个实例的使用是零星的,它似乎工作得很好,如果它成为一个问题,我可以在服务器机架中的 SSD 上提供一些交换分区作为每个服务器的交换空间. 当每个实例启动时,我通过一个 powershell 脚本将每个实例的工作集大小设置为 300MB,最小操作系统总是有 1GB 可用,每个人似乎都很高兴。
几天来,我一直在工作中的网络上进行挖掘,试图弄明白 DBMS(SQL Server 2008 R2 和其他)如何如此快速地将一列添加到大表的末尾。
在高层次上,您可以认为:我可以在末尾放置一个指向新列的指针。但是,在页面级别上,数据页面不是填充了单个记录吗?添加一列是否意味着每个已经满的页面都需要拆分?
即使页面未满,也需要大量数据处理才能将该列添加到每条记录的末尾,更新所有插槽数组,然后通过任何现有索引和/或 IAM 和 GAM 页面级联所有指针更改?
我唯一能想到的是,所有新的列数据都被添加到新的页面中,没有记录的其余部分,并且在整个表树结构中添加指针以引用新的列页面。然而,这似乎会破坏空间局部性。如果是这样,即使我们没有特别请求,DBMS 是否会在幕后处理数据REBUILD?
我正在谈论带有页面的 DBMS 内存管理的位级别,并询问 DBMS 如何能够如此快速地将一列(允许或不允许 NULL 值)添加到一组现有记录中,即使这些记录已经作为一组存在数据页中的位。
我在 SQL Server 2008 环境中。
我试图在WHERE子句中使用模式匹配来查找特定列的值包含非字母数字、下划线、破折号、句点或空格字符的行。
这是我的代码和示例数据,但我没有得到预期的结果。
在示例数据中,我想返回第 7、8、9 和 12 行,但我得到的是第 5 行和第 6 行。
如果这不是实现目标的最佳方式,我愿意听取其他方法。
我不在可以实现正则表达式的环境中,因此我的解决方案仅限于开箱即用的功能。
CREATE TABLE PATTERN_TEST
(
ID INT NOT NULL,
STRING NVARCHAR(40) NOT NULL
)
INSERT INTO PATTERN_TEST
SELECT 1, 'string' UNION
SELECT 2, 'STRING' UNION
SELECT 3, 'string space' UNION
SELECT 4, 'STRING SPACE' UNION
SELECT 5, 'string-dash' UNION
SELECT 6, 'string-dash space' UNION
SELECT 7, 'string "otherchar"' UNION
SELECT 8, 'string "other char"' UNION
SELECT 9, '"string"' UNION
SELECT 10, …Run Code Online (Sandbox Code Playgroud) 我们目前有一些ALLOW_PAGELOCKS设置为关闭的索引。这样做大概是为了减少死锁。但是,我怀疑当时它真的会产生影响。
现在我试图了解 SQL Server 何时实际选择开始锁定页面而不是聚集索引中的键。我最近问过 Jonathan Keyhaisas,他告诉我如果我在多个后续页面上触摸行,就会发生这种情况。但是,我没有通过使用示例查询更新聚集索引中的行来获得任何独占页面锁。
你能通过示例查询和表帮助我更好地理解页锁吗?我正在运行 SQL Server 2008 SP4。
提前致谢
马丁
sql-server ×10
sql-server-2008 ×10
data-pages ×1
datatypes ×1
locking ×1
remote ×1
t-sql ×1
xp-cmdshell ×1