我需要使用SQL替换xml中的值,我面临的挑战是我要替换的值不在特定的xpath上,相同的值在不同的节点上并且xpath也不同,所以基本上我想找到并替换一个值。
例子:
<data>
<policy>
<Effectivedate>2018-04-05</Effectivedate>
<TermStartDate>2018-04-05</TermStartDate>
<Line>
<Risk>
<Coverage>
<Type>1</Type>
<coverstartdate>2018-04-05</coverstartdate>
</Coverage>
<Coverage>
<Type>2</Type>
<coverstartdate>2018-04-05</coverstartdate>
</Coverage>
<Coverage>
<Type>3</Type>
<coverstartdate>2018-04-05</coverstartdate>
</Coverage>
</Risk>
</Line>
</policy>
</data>
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,我需要将日期 2018-04-05 替换为 2018-04-06
请有人在这里帮忙。
这个简单的例子显示了我遇到的问题,但我不明白为什么......
我正在测试传递给我的字符串参数中第一个字符的位置,该字符是小写字母或大写字母、单个破折号或句点。
这两个模式匹配似乎检查相同的内容,但您自己运行此代码,它会打印 0,然后打印 3:
PRINT PATINDEX ( '%[a-z,A-Z,-,.]%', '16-82')
PRINT PATINDEX ( '%[-,a-z,A-Z,.]%', '16-82')
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它只起作用当破折号字符是我们检查的第一个字符时它才起作用。
这是一个错误吗?或者按照设计工作,但我错过了一些东西......我正在使用 SQL Server 2016,但我认为这并不重要。
我正在尝试根据数据库服务器的时钟生成唯一的 ID/时间戳。这不是表的主 ID,但我感兴趣的是该值对于每一行都是唯一的。该代码位于一个存储过程中,该存储过程将由同时运行的各个进程同时执行。
我已经想出了这段代码,但找不到让它更优雅的方法。据我测试,确保其他进程不会在其他线程上生成相同值的唯一方法是在检查是否存在时锁定表。
DECLARE @CurrentRRN varchar(30)
SET @CurrentRRN = FORMAT(SYSDATETIME(), 'yyyyMMddHHmmssffffff')
IF(EXISTS(SELECT RRN FROM dbo.Numbering WITH (xlock, tablockx, holdlock)
WHERE RRN = @CurrentRRN)) BEGIN
WHILE( EXISTS(SELECT RRN FROM dbo.Numbering WHERE RRN = @CurrentRRN) )
BEGIN
SET @CurrentRRN = FORMAT(SYSDATETIME(), 'yyyyMMddHHmmssffffff')
END
END
INSERT INTO dbo.Numbering
(RRN)
Values
(@CurrentRRN)
print @CurrentRRN
Run Code Online (Sandbox Code Playgroud) 在下面的 SQL 语句中,有一些 T-SQL 将数字添加到 adatetime和 a 中date:
declare @t table(UserID int, StartDate datetime, EndDate date)
insert @t select 1, '20110101', '20110102'
-- Adding int to a datetime works
select t.StartDate + 2 as NewStartDate
-- Adding int to a date errors
select t.EndDate + 2 as NewEndDate
Run Code Online (Sandbox Code Playgroud)
我预计上述两个 select 语句都会失败,因为它们都没有使用该DATEADD方法,但令我惊讶的是,在不使用 using的情况下将 an 添加int到 a 中是有效的。这是为什么?datetimeDATEADD
我想知道,这项工作有可能实现吗?
declare @SQL varchar(max),
@query varchar(max) ='select * from Table'
select @SQL='USE LinkedServer.DBName ' + @query'
exec (@SQL)
Run Code Online (Sandbox Code Playgroud)
'USE'如果您用于在同一服务器上运行查询,但不能在链接服务器上运行查询,则它可以正常工作。
我想要的是创建将在不同服务器和数据库上运行一些动态查询的过程,并且我想将 ServerName 和 DBName 作为参数传递给该 sp。
注意:我不想这样使用它:
declare @SQL varchar(max)
select @SQL='
select * from LinkedServer.DBName..Table'
exec (@SQL)
Run Code Online (Sandbox Code Playgroud)
由于该 select 语句将从表中检索
我尝试将数据获取到@DataSrcCatIds变量。但是 SQL Server 抛出错误
ASSIGNMENT 语句中不允许使用 FOR XML 子句
我用 Google 搜索并找到了解决方案,但该解决方案不使用 CTE。我必须使用公用表表达式对其进行 DataSrcCatIds 。
CTE有什么解决办法吗?
谢谢
DECLARE @DataSrcCatIds AS NVARCHAR(MAX)
;WITH CatTree (CategoryId ) AS
(
SELECT CategoryId FROM Categories
WHERE SefLink='my-link'
UNION ALL
SELECT ct.CategoryId
FROM Categories ct
INNER JOIN CatTree AS parent ON parent.CategoryId = ct.ParentCatId
)
SELECT @DataSrcCatIds = DataSrcCatIds + ','
FROM Categories c
JOIN CatTree ct ON ct.CategoryId = c.CategoryId
FOR XML PATH ('')
SET @DataSrcCatIds = LEFT(@DataSrcCatIds, LEN(@DataSrcCatIds) - 1)
Run Code Online (Sandbox Code Playgroud) 在 SQL Server 2014 select 子句中,
AVG(CONVERT(DECIMAL(11, 8), p.[Total])) AS [Value]
Run Code Online (Sandbox Code Playgroud)
其中p.[Total]的类型为varchar(50),会引发此错误:
消息 8115,级别 16,状态 8,第 2 行
将 varchar 转换为数据类型 numeric 时发生算术溢出错误
但
AVG(TRY_CONVERT(DECIMAL(11, 8), p.[Total])) AS [Value]
Run Code Online (Sandbox Code Playgroud)
不返回任何空值,当 CONVERT 失败时它应该这样做。当我省略 [Value] 列时,返回的行数与使用 TRY_CONVERT 时相同。
另外,使用 TRY_CONVERT 保留 [Value] 并使用过滤空值
HAVING AVG(TRY_CONVERT(DECIMAL(11, 8), p.[Total])) IS NULL
Run Code Online (Sandbox Code Playgroud)
不返回任何行。为什么TRY_CONVERT似乎对所有行(无空值)都有效,但CONVERT事实并非如此?
今天,工作中的首席 DBA 说我不应该使用 ITVF 来完全包装视图,但从我的基本基准来看,我对此表示怀疑。看起来 SQL Server 只是在查询时对它实际需要的列进行排序(基于函数的请求)。我这么说是因为我发现下面两个示例的执行时间非常相似。
uf_GetCustomersByCity_A在此示例中,我创建了一个 ITVF,它执行 a 操作SELECT *,返回一个已过滤的CustomerView。
CREATE FUNCTION [dbo].[uf_GetCustomersByCity_A] (@idCity INT)
RETURNS TABLE
AS RETURN
SELECT CustView.*
FROM [dbo].[CustomerView] CustView
WHERE CustView.idCity = @idCity
GO
Run Code Online (Sandbox Code Playgroud)
uf_GetCustomersByCity_BCREATE FUNCTION [dbo].[uf_GetCustomersByCity_B] (@idCity INT)
RETURNS TABLE
AS RETURN
SELECT CustView.idCustomer
, CustView.cFullName
, CustView.cCityName
, CustView.fBalance
FROM [dbo].[CustomerView] CustView
WHERE CustView.idCity = @idCity
GO
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是否是一个有效的观察结果,或者只是长时间调试的副作用(假设 SQL Server 通过使用进行优化)。在视图中提供所需的所有内容而不是在 ITVF 中专门指定每一列具有很大的价值。
因此,两者都工作得很好,在 4-5 秒内产量约为 500k 行(注意:有一些复杂的子句会导致漫长的执行时间,这些示例很难说明这里的目的)。该视图有大约 70 或 80 列,其中许多都是内联格式化或操作的。
-- …Run Code Online (Sandbox Code Playgroud) 环境:SQL Server 2014及以上
如何使用 SELECT 语句访问 JSON 值中的电子邮件值?
select JSON_VALUE('[{"data":{"email":"test@email.com"}}]', '$.email') as test
Run Code Online (Sandbox Code Playgroud) 我之前曾在这里看到过类似的问题,但我的问题的不同之处在于我无法通过唯一的 ID 进行分区。
这是我的表 Request_Data 的样子:
ID Request_ID Location Order_Code Review_Status
=================================================
1 1 HQ SXXXXF Not Reviewed
2 1 Scranton ASDFGH Reviewed
3 1 Scranton ABCDEF Reviewed
4 1 Binghamton PSDFJG Not Reviewed
5 2 Scranton GGGGGG Reviewed
6 2 Stamford PRWERE Not Reviewed
7 2 Scranton UYUIFG Reviewed
Run Code Online (Sandbox Code Playgroud)
我希望我的查询返回:
Request_ID Location Review_Status
==================================================
1 HQ Not Reviewed
1 Scranton Reviewed
1 Binghamton Not Reviewed
2 Scranton Reviewed
2 Stamford Not Reviewed
Run Code Online (Sandbox Code Playgroud)
换句话说,我的表引用了一个外键请求id,其中包含多个要审核的订单代码,每个订单代码都有一个区域。一个区域的订单代码都是一次性审核的,因此我只需要每个区域的每个请求 ID 返回一条记录即可获取该区域的审核状态。
我知道这是一个奇怪的设计;我没有设置这个,但我必须使用它。谢谢。