Alcuni comandi utili da utilizzare in un server MSSQL.
-- Visualizza l'elenco dei server disponibili, locale e collegati sp_helpserver
-- List of databases
SELECT * FROM master..sysdatabases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')
-- or
EXEC sp_databases
-- show List of Tables for the current db USE myDB GO SELECT name FROM sys.Tables GO
-- Per rinominare un server con istanza autonoma sp_dropserver 'CURRENTNAME'; GO sp_addserver 'NEWNAME', local; GO
-- permette di esequire OPENQUERY sul server locale exec sp_serveroption @server = 'SERVERNAME' ,@optname = 'DATA ACCESS' ,@optvalue = 'TRUE'
-- Create an unique name for a temp table
DECLARE @tempTable varchar(255) = 'myprefix_' + convert(varchar(36),NEWID())
-- select @tempTable
-- build query
SET @Sql =
'SELECT * INTO [##' + @tempTable + '] FROM myTable'
EXEC (@Sql)
EXEC ('SELECT * FROM [##' + @tempTable + '] ')
EXEC ('DROP TABLE [##' + @tempTable + ']')
PRINT 'Dropped Table ' + @tempTable
-- Create a simple new counter columns SELECT ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter , my_first_column , my_second_column, FROM my_table -- Create a grouped new counter columns -- Counter will be reset when Country change SELECT ROW_NUMBER() OVER (PARTITION BY Country, Country ORDER BY Country) AS Row_Counter , Country , City from CountryTable order by Country -- Create a grouped new counter columns -- Counter will be reset when Country change SELECT ROW_NUMBER() OVER (PARTITION BY Country, City ORDER BY Country, City) AS Row_Counter , Country , City from CountryTable order by Country, City
--- Create Role and assign the execute to it and the to the user Use myDatabase go -- The role will be created in the current database "myDatabase" CREATE ROLE db_executor -- Grant the execute to the role GRANT EXECUTE ON SCHEMA::dbo TO db_executor -- assin the new role db_executor to the specified user exec sp_addrolemember 'db_executor', 'myuser'
SHOW COLLECTION OF ALL DATABASES
--Verify the collation setting for all databases SELECT name, collation_name FROM sys.databases order by collation_name
CHECK IF OBJECT EXISTS
-- A way to test if a database exists
USE master;
GO
IF DB_ID (N'myDB') IS NOT NULL
DROP DATABASE myDB;
GO
-- A way to test if a Table exists
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[myDB]') AND type in (N'U'))
DROP TABLE dbo.myDB
-- or another could be is...
IF NOT EXISTS(SELECT Distinct TABLE_NAME FROM information_schema.TABLES Where TABLE_NAME = 'Your_Table')
BEGIN
--CREATE TABLE
Your_Table
END
-- a way to test if a view exists
IF OBJECT_ID('myDB.dbo.myView', 'V') IS NOT NULL
DROP VIEW myView;
GO
--Check if it exists
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
BEGIN
PRINT '#temp exists!'
END
ELSE
BEGIN
PRINT '#temp does not exist!'
END
-- Rebuild index for the database
USE myDB
GO
EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?', ' ', 80)"
GO
EXEC sp_updatestats
GO
-- Rebuild index for all database excluding some
exec sp_MSforeachdb '
IF ''!'' NOT IN (''master'',''model'',''msdb'',''tempdb'')
BEGIN
USE [!];
EXEC sp_MSforeachtable ''ALTER INDEX ALL ON ? REBUILD''
END',@replacechar = '!'
-- Read all database excluding status ...
SELECT name FROM master.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb','distrbution') -- exlude system databases
AND status & -- exclude statuses not suitable for reindexing
( 32 -- loadig
| 64 -- pre recovery
| 128 -- recovering
| 256 -- not recovered
| 512 -- offline
|1024 -- readonly
|2048 -- dbo use only
|4096 -- single user
|32768 -- emergency mode
) = 0
-- Allow to print more chars
PRINT CAST(@SQLALL AS NTEXT)
Search substring starting from right
/*
GOAL: get myfilename.xls from the following fullpath
c:\myfolder1\myfolder2\myfilename.xls
*/
SELECT right([FILENAME], charindex('\',reverse(FILENAME))-1) FROM [ICT].[dbo].[file2]
Store into a var a list of values returned from a select
-- Store a list of key values returned from a select declare @progrList nvarchar(max) set @progrList= '' select @progrList= @progrList+ convert(varchar(6), myColKey) + ', ' from myTable print @resULT
SQL variable to hold list of integers
I found this very great solution to stackoverflow
declare @listOfIDs table (id int);
insert @listOfIDs(id) values(1),(2),(3);
select *
from TabA
where TabA.ID in (select id from @listOfIDs)
or
declare @listOfIDs varchar(1000);
SET @listOfIDs = ',1,2,3,'; --in this solution need put coma on begin and end
select *
from TabA
where charindex(',' + CAST(TabA.ID as nvarchar(20)) + ',', @listOfIDs) > 0
Send e-mail
You can send an e-mail calling a system store procedure. useful to notify an error or sending periodical results of select
note: you need to configure the "e-mail" on your MSSQL server.
-- Send an e-mail using T-SQL
USE msdb
EXEC sp_send_dbmail
@profile_name = 'YourProfileMailConfiguredOnYourServer',
@recipients = 'youraddress@yourdomain.com',
@subject = 'Please check the records attached',
@body = 'The result from SELECT:',
@execute_query_database = 'msdb',
@query = 'SELECT myCol1, myCol2 FROM myTable'
-- You can use the following to append a newline
@query = "PRINT CHAR(13)+'Use double-quotation marks.' + CHAR(13) + 'Start a newline'"
EXPORT TO EXCEL
-- Exec a select from command line -- You need to configure your server to allow it Exec xp_cmdshell 'bcp "Select * from [Control08].[dbo].[xAnva200F]" queryout "C:\testing.xls" -c -T' --- HOW TO CONFIGURE THE SERVER TO ALLOW A SHELL COMMAND -- => xp_cmdshell -- To allow advanced options to be changed. EXEC sp_configure 'show advanced options', 1 GO -- To update the currently configured value for advanced options. RECONFIGURE GO -- To enable the feature. EXEC sp_configure 'xp_cmdshell', 1 GO -- To update the currently configured value for this feature. RECONFIGURE GO
COLUMN NOT SORTABLE
-- BEFORE => Not Ordered Data
SELECT *
FROM (
SELECT 'BT-1' AS Col UNION ALL
SELECT 'BT-2' AS Col UNION ALL
SELECT 'BT-10' AS Col UNION ALL
SELECT 'BT-11' AS Col UNION ALL
SELECT 'BT-100' AS Col UNION ALL
SELECT 'BT-101' AS Col
) AS myTable
ORDER BY
Col
-- AFTER => Data Sorted
SELECT Col, LEFT(Col, LEN(Col) - CHARINDEX('-', REVERSE(Col))) + '-' + REPLICATE('0', 7 - LEN(right(Col,charindex('-',reverse(Col))-1)) ) + right(Col,charindex('-',reverse(Col))-1) AS ColSortable
FROM (
SELECT 'BT-1' AS Col UNION ALL
SELECT 'BT-2' AS Col UNION ALL
SELECT 'BT-10' AS Col UNION ALL
SELECT 'BT-11' AS Col UNION ALL
SELECT 'BT-100' AS Col UNION ALL
SELECT 'BT-101' AS Col
) AS myTable
ORDER BY
ColSortable
COMMIT / ROLLBACK
I know 2 ways:
- General Options for your Client
- SQL Script for Single Tansaction
General Option for your Client
You can set a general options in your Microsoft SQL Server Management Studio.
- Tools -> Options
- Query Execution -> SQL Server -> ANSI => SET IMPLICIT_TRANSACTION "Checked"
SQL Script for Single Tansaction
-- Option ON SET IMPLICIT_TRANSACTIONS ON --- Your update UPDATE myTable SET myfield=1 where... -- Performe a Rollback OR a Commit ROLLBACK COMMIT -- Option OFF SET IMPLICIT_TRANSACTIONS OFF
TABLE VARIABLE IN A DYNAMIC STATEMENT
I read a couple of solutions on StackOverflow.com. One is to replace the table variable with a temp table but it's not the right reply to the question. The second solution it's a bit complicated but not so much but it's possible only with mssql 2008 or superior.
I just copied and pasted here the example
CREATE TYPE MyTable AS TABLE
(
Foo int,
Bar int
);
GO
DECLARE @T AS MyTable;
INSERT INTO @T VALUES (1,2), (2,3)
SELECT *,
sys.fn_PhysLocFormatter(%%physloc%%) AS [physloc]
FROM @T
EXEC sp_executesql
N'SELECT *,
sys.fn_PhysLocFormatter(%%physloc%%) AS [physloc]
FROM @T',
N'@T MyTable READONLY',
@T=@T
REFERENCES
...to be continue...
