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)

OLE DB provider "SQLNCLI11" for linked server "" returned message "Cannot start more transactions on this session."

Try to do:
DISTRIBUTED TRANSACTION

Error message:
OLE DB provider "SQLNCLI11" for linked server "" returned message "Cannot start more transactions on this session."

Solution:
In order to enable the distributed transactions set:
SET XACT_ABORT ON;

Run dynamic sql from the linked server to the current one

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

BEGIN DISTRIBUTED TRANSACTION

DECLARE @SQL nvarchar(max)

BEGIN TRY
       set @SQL = 'REVERT; EXECUTE AS LOGIN = ''SA''
              EXECUTE(''
       UPDATE / INSERT / .....
       FROM [LinkedServerDataBaseName].[LinkedServerSchemaName].[LinkedServerTableName] b
       JOIN [MyServerNameAsLinkedServerName].[DataBaseName].[SchemaName].[TableName] ns  ON b.BRN_ID = ns.BRN_ID
       WHERE .......
              '') AT [LinkedServerName]';
       exec sp_executesql @SQL

       COMMIT TRANSACTION
END TRY

BEGIN CATCH

       -- ROLLBACK TRANSACTION
       -- do something....
END CATCH

SET XACT_ABORT OFF;


LinkedServerDataBaseName - database name in the linked server
MyServerNameAsLinkedServerName - my server has to be declared as linked server in the other server, this is it's linked server name there.
LinkedServerName - the linked server name in my server

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