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)

TRANSACTION between servers - DISTRIBUTED TRANSACTION

SET XACT_ABORT ON; -- In order to enable the distributed transactions
BEGIN DISTRIBUTED TRANSACTION

-- do something

ROLLBACK/COMMIT TRANSACTION
SET XACT_ABORT OFF;

The number of row value expressions in the INSERT statement exceeds the maximum allowed number of 1000 row values

Error message:
The number of row value expressions in the INSERT statement exceeds the maximum allowed number of 1000 row values.

Problem:
As written...  INSERT statement exceeds the maximum allowed number of 1000 row values.
Surprised, but INSERT statement using 'VALUES' (not insert with a select) - have limitation of 1000 inserted records.

Solution:
Anything that will use INSERTs with maximum 1000 records: separate to few INSERTs, insert the new data to temp table and insert using select from the temp table and so on.

exec query on other database

DECLARE @statement NVARCHAR(MAX) = N'select * from dbo.MyTable;

DECLARE @sql NVARCHAR(MAX) = QUOTENAME('OtherDbName') + '.sys.sp_executesql';

EXEC @sql @statement;

Merge with two options for MATCHED case

Remainder for MERGE syntax:

If there are 2 options what to do when we have a MATCHED between the source and he target tables - most of the times it will be deletion and update - we can do that like this:

MERGE <target_table> [AS TARGET]
.....
WHEN MATCHED AND <condition>
THEN DELETE
WHEN MATCHED  -- all the other cases of MATCHED other then the condition above
THEN UPDATE 
SET ColumnA = s.SomeValue
.....

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