标签: t-sql

使用 SQL 替换 XML 中的值

我需要使用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

请有人在这里帮忙。

xml t-sql sql-server xpath xquery

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

PATINDEX 查找短划线字符“-”时结果不正确

这个简单的例子显示了我遇到的问题,但我不明白为什么......

我正在测试传递给我的字符串参数中第一个字符的位置,该字符是小写字母或大写字母、单个破折号或句点。

这两个模式匹配似乎检查相同的内容,但您自己运行此代码,它会打印 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,但我认为这并不重要。

t-sql patindex

0
推荐指数
1
解决办法
768
查看次数

在 SQL Server 中的表上生成唯一的基于时间的 id

我正在尝试根据数据库服务器的时钟生成唯一的 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 sql-server

0
推荐指数
1
解决办法
7882
查看次数

此代码如何在不使用 DATEADD 的情况下向日期时间添加数字?

在下面的 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

sql t-sql sql-server

0
推荐指数
1
解决办法
661
查看次数

在链接服务器上运行动态查询

我想知道,这项工作有可能实现吗?

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 语句将从表中检索

t-sql sql-server

0
推荐指数
1
解决办法
1171
查看次数

使用 CTE 获取 XML 路径的值

我尝试将数据获取到@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 t-sql sql-server

0
推荐指数
1
解决办法
1407
查看次数

T-SQL CONVERT 错误但 TRY_CONVERT 没有空值

在 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事实并非如此?

sql t-sql sql-server

0
推荐指数
1
解决办法
1052
查看次数

内联表值函数中 SELECT * 的性能

今天,工作中的首席 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_B

CREATE 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)

t-sql sql-server stored-functions set-returning-functions

0
推荐指数
1
解决办法
2318
查看次数

Sql Server - 如何在 SQL Select 语句中获取 JSON 嵌套值

环境:SQL Server 2014及以上

如何使用 SELECT 语句访问 JSON 值中的电子邮件值?

select JSON_VALUE('[{"data":{"email":"test@email.com"}}]', '$.email') as test
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server

0
推荐指数
1
解决办法
2538
查看次数

SQL - 为每个非唯一 ID 选择具有不同一列的行

我之前曾在这里看到过类似的问题,但我的问题的不同之处在于我无法通过唯一的 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 返回一条记录即可获取该区域的审核状态。

我知道这是一个奇怪的设计;我没有设置这个,但我必须使用它。谢谢。

sql t-sql sql-server distinct

0
推荐指数
1
解决办法
480
查看次数