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)

Few notes about Dynamic SQL

Any USE statement in the dynamic SQL will not affect the calling stored procedure.

Temp tables created in the dynamic SQL will not be accessible from the calling procedure since they are dropped when the dynamic SQL exits. 
The block of dynamic SQL can access temp tables created by the calling procedure.

The effect of SET command in the dynamic SQL lasts for the duration of the block of dynamic SQL only and does not affect the caller.

When using stored procedures, users do not need permissions to access the tables accessed by the stored procedure. This does not apply when you use dynamic SQL!

The query plan for the stored procedure does not include the dynamic SQL!!!
The block of dynamic SQL has a query plan of its own.

The first parameter @stmt of sp_executesql is Unicode - nvarchar/ntext. varchar is not valid!

LEFT+RIGHT JOIN

FULL OUTER JOIN

CREATE TABLE #StamTable
( StamTableStr nvarchar(50) NULL )
INSERT INTO #StamTable (StamTableStr) VALUES ('111')
INSERT INTO #StamTable (StamTableStr) VALUES ('222')
GO
CREATE TABLE #StamTable2
( StamTable2Str nvarchar(50) NULL )
INSERT INTO #StamTable2 (StamTable2Str) VALUES ('111')
INSERT INTO #StamTable2 (StamTable2Str) VALUES ('333')
GO

select * 
from #StamTable a FULL OUTER JOIN #StamTable2 b 
on a.StamTableStr = b.StamTable2Str

drop table #StamTable
drop table #StamTable2

Performance checklist - few hints

Indexes speed the performance of queries. Create index considering the INSERT, UPDATE, DELETE and SELECT. If there is more use in one of those, consider it more than the others.

Using of table variable is stored in the plan cache. Temporary tables can be indexed. Check which one of them is better to a specific situation.

'OR' can be replaced by 'UNION' and vice versa. 
SELECT ... WHERE ColA = 5 OR ColB = 2
SELECT ... WHERE ColA = 5 UNION SELECT ... WHERE ColB = 2
Check which one of them is better to a specific situation.

'DISTINCT' can be replaced by 'GROUP BY' and vice versa. Check which one of them is better to a specific situation.

'JOIN' can be replaced by sub-query and vice versa. Check which one of them is better to a specific situation; usually 'JOIN' is better than sub-query.

sp_executesql is usually better than EXECUTE statement.

Usually using 'IF EXISTS' is better than count by SELECT COUNT (*).

Usually using 'EXISTS' is better than using sub-query.

Check Parameter Sniffing - is sometimes good and sometimes not.

Try to update statistics, recompile stored procedure, re-build indexes. They need to be refreshed from time to time.

'SET NOCOUNT ON' can speed the performance - in queries and procedures.

If not all the objects are owned by the same schema - call the objects with the schema - SchemaName.ObjectName.

Avoid using cursors.

Don't repeatedly reuse the same function or calculation in a T-SQL code.

Sort queries (ORDER BY) only when necessary.

SELECT DISTINCT only when it necessary.

Try to avoid using 'SELECT *'. Select the columns that you need.

When using 'LIKE', try to use it with leading characters in the clause: LIKE 'm%' instead of LIKE ‘%m%’.

Check Blocking and locks.

don't return more data (rows and columns) than you need to the client or middle-tier and then the data you really need at the client. This wastes SQL Server resources and network bandwidth.

Rename filegroup

ALTER DATABASE DBName MODIFY FILEGROUP [OldFileGroupName] NAME = [NewFileGroupName]
GO

Select SQL version

SELECT @@version as sql_version

An example of @@version output:
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)   Apr  2 2010 15:48:46   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) 

Get SET Options for the Current Session

SELECT @@OPTIONS

@@OPTIONS returns an integer that represents the bit values of the SET Options.
Here are the values of the SET options:

Here is a code to display which SET options are turned on:
DECLARE @options INT
SELECT @options = @@OPTIONS
IF ( (1 & @options) = 1 ) PRINT 'DISABLE_DEF_CNST_CHK' 
IF ( (2 & @options) = 2 ) PRINT 'IMPLICIT_TRANSACTIONS' 
IF ( (4 & @options) = 4 ) PRINT 'CURSOR_CLOSE_ON_COMMIT' 
IF ( (8 & @options) = 8 ) PRINT 'ANSI_WARNINGS' 
IF ( (16 & @options) = 16 ) PRINT 'ANSI_PADDING' 
IF ( (32 & @options) = 32 ) PRINT 'ANSI_NULLS' 
IF ( (64 & @options) = 64 ) PRINT 'ARITHABORT' 
IF ( (128 & @options) = 128 ) PRINT 'ARITHIGNORE'
IF ( (256 & @options) = 256 ) PRINT 'QUOTED_IDENTIFIER' 
IF ( (512 & @options) = 512 ) PRINT 'NOCOUNT' 
IF ( (1024 & @options) = 1024 ) PRINT 'ANSI_NULL_DFLT_ON' 
IF ( (2048 & @options) = 2048 ) PRINT 'ANSI_NULL_DFLT_OFF' 
IF ( (4096 & @options) = 4096 ) PRINT 'CONCAT_NULL_YIELDS_NULL' 
IF ( (8192 & @options) = 8192 ) PRINT 'NUMERIC_ROUNDABORT' 
IF ( (16384 & @options) = 16384 ) PRINT 'XACT_ABORT'


Another way to check the settings of sessions is:
SELECT * FROM sys.dm_exec_sessions WHERE session_id in (68,61)


A list of the SET options: