标签: t-sql

CURRENT_TIMESTAMP 是否有可排序的('order by')替代方案

我正在寻找一种方法来查找填充了 CURRENT_TIMESTAMP 的列的可排序替代方案,我现在很困惑。

我有一个基于 Web 的表单,其中包含多个字段,包括一个隐藏在表单上的字段,该字段在提交表单时将 CURRENT_TIMESTAMP 写入数据库。

我面临的挑战是我想从这些表单创建报告(按月、周或年排序)并按时间戳排序但根据我在这里看到的内容排序是不可能的。

有没有替代方法可以用来实现我想要的结果?

sql-server t-sql sql-server-2012

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

需要帮助将此游标转换为基于集合的操作

我有一个存储过程,它作为报告数据库每晚刷新的一部分运行,大约需要 2 个小时才能完成。该对象B_RPT_RC_AUDIT_ASSIGNED_TO_TEMP_T2有 800 万行。您能否建议我如何将此光标转换为基于集合的方法以获得更好的性能?可以使用 CTE 吗?

ALTER PROCEDURE [dbo].[B_RPT_RC_AUDIT_ASSIGNED_TO_TEMP2_SP] AS      
SET NOCOUNT ON        
DECLARE @SEQ SMALLINT,      
@CASEID DECIMAL,       
@ASSIGNED  NCHAR(30),      
@AUDITSTAMP DATETIME,      
@AUDITOPRID NCHAR(60),      
@STATUS NCHAR(10),      
@LASTCASEID DECIMAL,       
@PROVGRPID NCHAR(20)      
SET @SEQ = 1      
SET @LASTCASEID = @CASEID      

DROP TABLE B_RPT_RC_AUDIT_ASSIGNED_TO_TEMP   

CREATE TABLE B_RPT_RC_AUDIT_ASSIGNED_TO_TEMP (      
  SEQ_NUM SMALLINT,       
  CASE_ID DECIMAL,       
  ASSIGNED_TO NCHAR(30),       
  AUDIT_STAMP DATETIME,       
  AUDIT_OPRID NCHAR(60),      
  RC_STATUS NCHAR(10),      
  PROVIDER_GRP_ID NCHAR(20) )      
DECLARE AUDIT CURSOR FOR        
   SELECT CASE_ID, ASSIGNED_TO, AUDIT_STAMP, AUDIT_OPRID, RC_STATUS, PROVIDER_GRP_ID      
   FROM B_RPT_RC_AUDIT_ASSIGNED_TO_TEMP_T2      

-- Open the cursor …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

带有和不带有 SELECT 关键字的 UPDATE 语句

我一直在做一些关于SELECT从这个更新中删除关键字的测试:

Update  #tmpDriverTime
Set     WorkDay2 = (Select IsNull(Sum(PyblHrs),0)
From    spr_DriverTimeEntry
Where   spr_DriverTimeEntry.DrvrID = #tmpDriverTime.EmployeeNo
And     Convert(Varchar(12),dtwrkd,112) = Convert(Varchar(12),@StartDate_1,112))
Run Code Online (Sandbox Code Playgroud)

从我所做的测试来看,无论是否有SELECT关键字,都返回了相同的数据。我由我们的 DBA 运行代码以获得他删除SELECT语句的批准,他说我不能,因为删除SELECT语句会导致更新以不同的方式工作,但他无法阐明它的工作方式有何不同。我已经对新的进行了一些搜索,并找到了一些 MSDN 页面,他们在其中运行UPDATE FROM没有SELECT关键字的命令。所以现在我很困惑,我在 MSDN 上找到的测试和其他示例说我可以删除SELECT关键字,但我的 DBA 说不。删除SELECT关键字是否会影响UPDATE FROM工作方式,如果会,它会如何影响它?

sql-server-2005 sql-server t-sql update

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

多字节替换在 SQL Server 中不起作用

为什么一个有效而另一个无效?

SELECT REPLACE(N'IA?I' ,N'?','x') -- doesn't match (returns 'IA?I')
SELECT REPLACE('IA?I' ,'?','x') -- works (returns 'IAxI')
Run Code Online (Sandbox Code Playgroud)

我的猜测是在第二个示例中 SQL Server 会看到 '?' 作为 2 个字符 (0x19 02) 并且不做一些破坏多字节匹配的整理优化。

应该怎么做才能使多字节示例工作?

sql-server t-sql

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

我可以改进这个查询吗?

SELECT * 
FROM   SameLogTable
WHERE  ID_Table IN (SELECT ID_Table-1
                    FROM   SameLogTable
                    WHERE  <SameCondition>) OR
       ID_Table IN (SELECT ID_Table
                    FROM   SameLogTable
                    WHERE  <SameCondition>) OR
       ID_Table IN (SELECT ID_Table+1
                    FROM   SameLogTable
                    WHERE  <SameCondition>)
Run Code Online (Sandbox Code Playgroud)

此查询在日志记录表上运行,我想选择特定事件,以及这些事件之前和之后的事件。这个解决方案感觉丑陋且效率低下,为此编写更好的方法是什么?

示例:如果我对 LogTable 的 ID 为 4 和 23 的行感兴趣,我想得到以下结果:

ID    Column1    Column2    ...
3     ...        ...
4     ...        ...
5     ...        ...
22    ...        ...
23    ...        ...
24    ...        ...
Run Code Online (Sandbox Code Playgroud)

这些都是来自同一 LogTable 的所有行,除了我使用 WHERE 指定第 4 行和第 23 行,并且我希望 Select 自动返回第 3,5 行(第 4 行)和第 22、24 行(第 …

performance t-sql sql-server-2008-r2 query-performance

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

更新行的性能

在 SQL Sever 中更新时,我的理解是删除整行然后重新创建(这就是您获得新时间戳的原因)。那么,如果您更新 1 个字段或 500 个字段,更新的性能是否会发生变化?

我怀疑如果有索引列,因为它必须更新索引,服务器会执行更多的“工作”。回答时,假设没有触发器。

performance sql-server t-sql update query-performance

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

由于 where 子句过滤器,右外连接似乎不起作用

我有以下查询,我需要修改它,以便originDocForCurrency.id = 68如果没有匹配的commission.referenzid = 68. 我尝试了RIGHT OUTER JOIN ON commission.referenzid = originDocForCurrency.id,但它不会给出结果,如果没有找到commission.referenzid = 68.

SELECT
    commission.netto AS commissionNetValue,
    commission.r_art AS commissionDocClass,
    commission.waehrung AS commissionCurrency,
    currencies.usd_brief AS foreignCurrencyUSDAsk,
    currencies.usd_geld AS foreignCurrencyUSDBid,
    originDocForCurrency.r_art AS originDocForCurrencyDocClass,
    originDocForCurrency.poswert AS originDocForCurrencyCommission,
 (SELECT originDoc.poswert FROM [src_boss_entwicklung].[dbo].[tckopf] AS originDoc WHERE originDoc.id = 68) AS originDocCommission,
 (SELECT originDoc.r_art FROM [src_boss_entwicklung].[dbo].[tckopf] AS originDoc WHERE originDoc.id = 68) AS originDocClass,
 (SELECT originDoc.waehrung FROM [src_boss_entwicklung].[dbo].[tckopf] AS originDoc WHERE originDoc.id = 68) AS originDocCurrency …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

在 where 查询中订购条件是否有意义?

我们在表 Tbl 中有一个聚集索引,顺序为 A、B、C。编写一个查询是否有意义

WHERE A = @a, B = @b, C = @c
Run Code Online (Sandbox Code Playgroud)

或者它会和

WHERE C = @c, B = @b, A = @a
Run Code Online (Sandbox Code Playgroud)

查询顺序对聚集索引有意义吗?

performance sql-server clustered-index t-sql query-performance

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

从双引号括起来的记录中删除一个字符

我有一个表,其中每一行都有如下数据:

0150566115,"HEALTH 401K","IC,ON","ICON HEALTH 401K",,,1,08/21/2014
Run Code Online (Sandbox Code Playgroud)

我想要的是删除,包含在双引号“”之间的每个逗号 ( )。然后用逗号 ( ,)分割字符串的其余部分

我不想检查双引号开始和结束的每个字符设置标志。

我可以实现某种正则表达式吗?

有没有简单的方法?

到目前为止,我所尝试的只是根据逗号 ( ,)拆分字符串,但它也在拆分引号内的值。

这是为了达到目的:如何在完整的表中实现这一点(目前,如果我只有一个双引号块实例,它就可以工作)?

Declare @Query nvarchar(max) 

Set @Query = 'Item1,Item2,"Item,Demo,3",New'

Declare @start int, @len int
SELECT @start = PATINDEX('%"%"%', @Query) + 1

print @start

select @len = CHARINDEX('"', SUBSTRING(@Query, @start, LEN(@Query))) - 1

select 
        SUBSTRING(@Query, 1, @start - 2) +
        REPLACE((SUBSTRING(@Query, @start, @len)), ',', '') +
        SUBSTRING(@Query, @start + @len + 1, LEN(@Query))
Run Code Online (Sandbox Code Playgroud)

这是我用来分割的函数

ALTER FUNCTION [dbo].[fnSplit](
    @sInputList VARCHAR(8000) -- List of …
Run Code Online (Sandbox Code Playgroud)

sql-server regular-expression t-sql string-splitting

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

Tsql 查询速度因 Or 内 where 子句而变慢,导致索引扫描而不是搜索

我一直在努力使这个查询更有效地工作。

我发现 where 子句中 Or 的数量是这个查询中最大的问题。此查询位于存储过程中。

我到了我能想到的唯一选择的地步。:

  • 为所有不同的入站参数可能性创建 16 种不同的查询。
  • 创建动态 sql 查询,但我认为这不会更快
  • 恢复到字符串 sql,但我不喜欢这样做,因为它们的执行速度不如存储过程。

我相信其他人以前也遇到过这个问题。查询性能在大约一秒或更短的时间内开始并不可怕,但在某些情况下,它被多次命中,导致长达 5 或 6 秒的延迟。

查询如下。:

DECLARE @PERSON_ID AS INT
DECLARE @ITEM_ID AS INT
DECLARE @ITEM_VERSION AS INT
DECLARE @ITEM_SUB_NAME AS VARCHAR(250)
DECLARE @ITEM_SUB_SUB_NAME AS VARCHAR(250)

--DEFAULTS
SET @PERSON_ID = 0
SET @ITEM_ID = 0
SET @ITEM_VERSION = 1
SET @ITEM_SUB_NAME = NULL
SET @ITEM_SUB_SUB_NAME = NULL

    SELECT ID, PERSON_ID, 
           ISNULL(ITEM_VERSION, 1) AS ITEM_VERSION,
           ISNULL(ITEM_SUB_NAME, '') AS 'ITEM_SUB_NAME',
           ISNULL(ITEM_SUB_SUB_NAME, '') AS 'ITEM_SUB_SUB_NAME',
           ISNULL(ITEM_DATE, '1/1/1900') AS …
Run Code Online (Sandbox Code Playgroud)

performance index sql-server t-sql query-performance

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