Labels

admin (1) aix (1) alert (1) always-on (2) Architecture (1) aws (3) Azure (1) backup (3) BI-DWH (10) Binary (3) Boolean (1) C# (1) cache (1) casting (3) cdc (1) certificate (1) checks (1) cloud (3) cluster (1) cmd (7) collation (1) columns (1) compilation (1) configurations (7) Connection-String (2) connections (6) constraint (6) copypaste (2) cpu (2) csv (3) CTE (1) data-types (1) datetime (23) db (547) DB2 (1) deadlock (2) Denali (7) device (6) dotNet (5) dynamicSQL (11) email (5) encoding (1) encryption (4) errors (124) excel (1) ExecutionPlan (10) extended events (1) files (7) FIPS (1) foreign key (1) fragmentation (1) functions (1) GCP (2) gMSA (2) google (2) HADR (1) hashing (3) in-memory (1) index (3) indexedViews (2) insert (3) install (10) IO (1) isql (6) javascript (1) jobs (11) join (2) LDAP (2) LinkedServers (8) Linux (15) log (6) login (1) maintenance (3) mariadb (1) memory (4) merge (3) monitoring (4) MSA (2) mssql (444) mssql2005 (5) mssql2008R2 (20) mssql2012 (2) mysql (36) MySQL Shell (5) network (1) NoSQL (1) null (2) numeric (9) object-oriented (1) offline (1) openssl (1) Operating System (4) oracle (7) ORDBMS (1) ordering (2) Outer Apply (1) Outlook (1) page (1) parameters (2) partition (1) password (1) Performance (103) permissions (10) pivot (3) PLE (1) port (4) PostgreSQL (14) profiler (1) RDS (3) read (1) Replication (12) restore (4) root (1) RPO (1) RTO (1) SAP ASE (48) SAP RS (20) SCC (4) scema (1) script (8) security (10) segment (1) server (1) service broker (2) services (4) settings (75) SQL (74) SSAS (1) SSIS (19) SSL (8) SSMS (4) SSRS (6) storage (1) String (35) sybase (57) telnet (2) tempdb (1) Theory (2) tips (120) tools (3) training (1) transaction (6) trigger (2) Tuple (2) TVP (1) unix (8) users (3) vb.net (4) versioning (1) windows (14) xml (10) XSD (1) zip (1)

FOR XML PATH(''), TYPE).value('.','NVARCHAR(max)')

An encoding issue with “FOR XML PATH”:

DECLARE @str NVARCHAR(MAX)= N'h&s_dor, Zoe&lee88AB'

select stuff(( select ',' + t.Alias from split ( @str, ',') t
                           FOR XML PATH(''))
                     ,1,1,'') EncStr



Solution:
FOR XML PATH(''), TYPE).value('.','NVARCHAR(max)')

select stuff((( select ',' + t.Alias from split ( @str, ',') t
                           FOR XML PATH(''), TYPE).value('.','NVARCHAR(max)'))
                     ,1,1,'') EncStr


Check constraint on a column value for each ID in the table

Our goal: to check in the DB level that for each ID (or other column) will be other column with a specific value not more than one time.

Wow - long statement… Let's do it with an example :)

CREATE TABLE [dbo].[SpecialCheckConst]
(      SomeID int,
       SomeStatusID int, -- we will check vaalues of this column
       SomeOtherColumn nvarchar(50) -- or any other columns
)

We want to check that for each SomeID there is no more than one record of SomeStatusID 1.

INSERT INTO dbo.SpecialCheckConst
       (      SomeID, SomeStatusID, SomeOtherColumn)
       VALUES
       (      2, 3, 'aaa'), (5, 1, 'sss')

When we will try to insert new record with SomeStatusID 1 for SomeID 2 - we should success.
When we will try to insert new record with SomeStatusID 1 for SomeID 5 - we should fail (because there is a record for this SomeID with status 1).
When we will try to insert new record with new SomeID - of course that SomeStatusID 1 is OK.

Solution: 
CHECK CONSTRAINT that calls a function that count the number of SomeStatusID 1 for the SomeID:

CREATE FUNCTION [dbo].[fn_SpecialCheckConst_SomeStatusIDOne]
(
       @SomeID int
)
RETURNS INT
AS
BEGIN
       DECLARE @SomeStatusIDOne int

       SELECT @SomeStatusIDOne = COUNT(*)
       FROM dbo.SpecialCheckConst
       WHERE SomeID = @SomeID
       AND SomeStatusID = 1

       RETURN @SomeStatusIDOne
END

GO
---------------------------------------------------------------------------------------------
ALTER TABLE [dbo].[SpecialCheckConst]  WITH CHECK ADD  CONSTRAINT [CHK_dbo_SpecialCheckConst_SomeStatusIDOne]
CHECK  (NOT ([dbo].[fn_SpecialCheckConst_SomeStatusIDOne](@SomeID) > 1 AND SomeStatusID = 1))
GO
ALTER TABLE [dbo].[SpecialCheckConst] CHECK CONSTRAINT [CHK_dbo_SpecialCheckConst_SomeStatusIDOne]
GO
---------------------------------------------------------------------------------------------

And ….. It’s work!

You can drop the example temp table:
--DROP TABLE dbo.SpecialCheckConst
--go

update Unicode strings in database

In SQL, in order to update Unicode values, you should add ‘N’ before the string

update [dbo].[Player]
set address1=N'aąbcćdeęfghijklłmnńoóprsśtuwyzźż',
address2=N'AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUWYZŹŻ'
where alias=N'Auto77086780' or Address1=N'tägelîch'

Here an example how an update statement without this ‘N’ will update wrong value (first update),
and how the same update statement but with ‘N’ will update the correct value (second update).

(BTW - the text is in Polish.)


datediff on LAG expression error - The datediff function resulted in an overflow

Query:
; with t as
(      SELECT [ID],
                     [LastRunTime],
                     LAG([LastRunTime], 1,0) OVER (ORDER BY [LastRunTime])  AS LAGLastRunTime
              , .....
       FROM .....
)
SELECT *, DATEDIFF(second, LAGLastRunTime , isnull(LastRunTime, '20010101')) as delta_
FROM t

Error message:
Msg 535, Level 16, State 0, Line 1
The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.

Reason for the error:
The “guilty” is the first record – that don’t have LAG date – so the LAG value is ‘1900-01-01 00:00:00.000’.
And then –datediff can’t go with so big int value  - the seconds/minutes/etc. between 1900 to the first date – that is probably more than 100 years… J


Solution:
Convert the first date to some reasonable date:

; with t as
(      SELECT [ID],
                     [LastRunTime],
                     ( case
                           when LAG([LastRunTime], 1,0) OVER (ORDER BY [LastRunTime]) > '20010101'
                                  then LAG([LastRunTime], 1,0) OVER (ORDER BY [LastRunTime])
                                  else [LastRunTime] end
                     )  AS LAGLastRunTime
              , .....
       FROM .....
)
SELECT *, DATEDIFF(second, LAGLastRunTime , isnull(LastRunTime, '20010101')) as delta_
FROM t

CPU usage per database

WITH DB_CPU_Statistics AS
(      SELECT pa.DatabaseID, DB_NAME(pa.DatabaseID) AS [Database Name],
                     SUM(qs.total_worker_time/1000) AS [CPU_Time_Ms]
       FROM          sys.dm_exec_query_stats AS qs WITH (NOLOCK)
       CROSS APPLY   (      SELECT CONVERT(INT, value) AS [DatabaseID]
                                  FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                                  WHERE attribute = N'dbid'
                           ) AS pa
       GROUP BY DatabaseID
)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [CPU Ranking],
              [Database Name], [CPU_Time_Ms] AS [CPU Time (ms)],
              CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPU Percent]
FROM DB_CPU_Statistics
WHERE DatabaseID <> 32767 -- ResourceDB
ORDER BY [CPU Ranking] OPTION (RECOMPILE);

SELECT the first of current month

SELECT DATEADD(month, DATEDIFF(month, 0, getdate()), 0) AS FirstOfCurrentMonth