/* Podstawy skryptw */
USE Northwind

DECLARE @Ident int

INSERT INTO Orders
(CustomerID, OrderDate)
VALUES
('ALFKI', DATEADD(day,-1,GETDATE()))

SELECT @Ident = @@IDENTITY

INSERT INTO [Order Dateils]
(OrderID, ProductID, UnitPrice, Quantity)
VALUES
(@Ident, 1, 50, 25)

SELECT 'The OrderID of the INSERTed row is ' + CONVERT(varchar(8),@Ident)

/* Przypisywanie wartoci do zmiennych*/

USE Northwind -- Przykad bdny
DECLARE @Test money
SET @Test = SELECT MAX(UnitPrice) FROM [Order Details]
SELECT @Test

USE Northwind
DECLARE @Test money
SET @Test = (SELECT MAX(UnitPrice) FROM [Order Details])
SELECT @Test

USE Northwind
DECLARE @Test money
SELECT @Test = MAX(UnitPrice) FROM [Order Details]
SELECT @Test

/* Uycie @@IDENTITY */

CREATE TABLE TestIdent
(
   IDCol   int   IDENTITY
   PRIMARY KEY
)

CREATE TABLE TestChild1
(
   IDCol   int
   PRIMARY KEY
   FOREIGN KEY
           REFERENCES TestIdent(IDCol)
)

CREATE TABLE TestChild2
(
   IDCol   int
   PRIMARY KEY
   FOREIGN KEY
           REFERENCES TestIdent(IDCol)
)


/************************************************** --Przykad bdny
* Skrypt ten pokazuje,
* w jaki sposb warto identyfikatora jest tracona
* w chwili zadziaania kolejnej instrukcji INSERT
************************************************ */


DECLARE @Ident   int -- Zmienna do przechowywania wartoci
                     -- Posuy do zademonstrowania przenoszenia wartoci z funkcji systemowej w bezpieczne miejsce.

INSERT INTO TestIdent
      DEFAULT VALUES

SET @Ident = @@IDENTITY
PRINT 'The value we got originally from @@IDENTITY was ' +
      CONVERT(varchar(2),@Ident)
PRINT 'The value currently in @@IDENTITY is ' + CONVERT(varchar(2),@@IDENTITY)
/* Teraz, przy pierwszym wywoaniu instrukcji INSERT, wykorzystujc @@IDENTITY, bdziemy mieli szczcie.
** Otrzymamy prawidow warto, poniewa pomidzy oryginaln instrukcj INSERT, a tym miejscem, nic innego si nie znajduje.
** Zauwaysz, e przy nastepnym INSERT, nie bdziemy ju mieli takiego szczcia. */
INSERT INTO TestChild1
VALUES
      (@@IDENTITY)

PRINT 'The value we got originally from @@IDENTITY was ' +
      CONVERT(varchar(2),@Ident)

IF (SELECT @@IDENTITY) IS NULL
   PRINT 'The value currently in @@IDENTITY is NULL'
ELSE
   PRINT 'The value currently in @@IDENTITY is ' + CONVERT(varchar(2),@@IDENTITY)

-- Kolejna linia tworzy odstp na wydruku
PRINT ''

/* Przy wywoaniu kolejnej linii wszystko si zawali, poniewa dana kolumna jest kluczem podstawowym w tabeli, a klucz podstawowy nie moe by ustawiony jako NULL.
** Do @@IDENTITY zostanie przypisana warto NULL, poniewa kilka linii wyej uruchomilimy instrukcj INSERT na tabeli, ktra nie posiada pola identyfikatora.
** Prawdopodobnie najistatniejsz rzecz jest to, w ktrym momencie @@IDENTITY si zmienia - bezporednio po instrukcji INSERT */
INSERT INTO TestChild2
VALUES
      (@@IDENTITY)


/**************************************************
* Skrypt ten pokazuje,
* w jaki sposb warto identyfikatora jest tracona
* w chwili zadziaania kolejnej instrukcji INSERT
************************************************ */


DECLARE @Ident   int -- Zmienna do przechowywania wartoci
                     -- Posuy do zademonstrowania przenoszenia wartoci z funkcji systemowej w bezpieczne miejsce.

INSERT INTO TestIdent
      DEFAULT VALUES

SET @Ident = @@IDENTITY
PRINT 'The value we got originally from @@IDENTITY was ' +
      CONVERT(varchar(2),@Ident)
PRINT 'The value currently in @@IDENTITY is ' + CONVERT(varchar(2),@@IDENTITY)
/* Teraz, przy pierwszym wywoaniu instrukcji INSERT, wykorzystujc @@IDENTITY bdziemy mieli szczcie.
** Otrzymamy prawidow warto, poniewa pomidzy oryginaln instrukcj INSERT, a tym miejscem nic innego si nie znajduje.
** Zauwaysz, e przy nastepnym INSERT nie bdziemy ju mieli takiego szczcia. */
INSERT INTO TestChild1
VALUES
      (@@IDENTITY)

PRINT 'The value we got originally from @@IDENTITY was ' +
      CONVERT(varchar(2),@Ident)

IF (SELECT @@IDENTITY) IS NULL
   PRINT 'The value currently in @@IDENTITY is NULL'
ELSE
   PRINT 'The value currently in @@IDENTITY is ' + CONVERT(varchar(2),@@IDENTITY)

-- Kolejna linia tworzy odstp na wydruku
PRINT ''

/* Tym razem wszystko przebiegnie prawidowo, poniewa korzystamy z wartoci przechowywanej w bezpiecznym miejscu zamiast bezporednio z @@IDENTITY */
INSERT INTO TestChild2
VALUES
      (@Ident)

/* Uycie @@ROWCOUNT */

USE Northwind
SELECT * FROM Categories

USE Northwind
GO
DECLARE @RowCount int -- Zwr uwag na pojedynczy znak @
SELECT * FROM Categories
SELECT @RowCount = @@ROWCOUNT
PRINT 'The value of @@ROWCOUNT was ' + CAST(@RowCount AS varchar(5))

/* Batch */

SELECT * FROM Customers WHERE CustomerID = 'ALFKI' GO --Przykad bdny

USE AdventureWorks
DECLARE @MyVarchar varchar(50) -- Zmienna dziaa tylko w tym programie wsadowym (batchu)!
SELECT @MyVarchar = 'Honey, I''m home...'
PRINT 'Done with first batch...'
GO
PRINT @MyVarchar  --To wywoanie powoduje bd, poniewa zmienna @MyVarchar nie jest zadeklarowana w tym batchu
PRINT 'Done with second batch'
GO 
PRINT 'Done with third batch'  -- Zauwa, e ten batch zadziaa nawet po powstaym bdzie
GO

/* Kiedy korzysta z programw wsadowych */

CREATE DATABASE Test

CREATE TABLE TestTable
(
   coli   int,
   col2   int
)

SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TestTable'

USE MASTER
DROP DATABASE Test

CREATE DATABASE Test

USE Test
CREATE TABLE TestTable
(
   col1   int,
   col2   int
)

CREATE DATABASE Test
GO

USE Test
CREATE TABLE TestTable
(
   col1   int,
   col2   int
)   

USE Test

ALTER TABLE TestTable
   ADD col3 int
			--Przykad bdny
INSERT INTO TestTable
(col1, col2, col3)
VALUES
(1,1,1)

/* SQLCMD */

C:\>copy con testsql.sql

SELECT * FROM Northwind..Shippers

C:\copy con WczorajszeZamowienia.sql

USE Northwind
SELECT cu.CompanyName,
       o.OrderID,
       o.OrderDate,
       od.ProductID,
       p.ProductName,
       od.Quantity,
       od.UnitPrice,
       od.Quantity * od.UnitPrice AS ExtendedPrice
FROM   Customers AS cu
INNER JOIN   Orders AS o
      ON cu.CustomerID = o.CustomerID
INNER JOIN   [Order Details] AS od
      ON o.OrderID = od.OrderID
INNER JOIN   Products AS p
      ON od.ProductID = p.ProductID
WHERE CONVERT(varchar(12),o.OrderDate,101) =
      CONVERT(varchar(12),DATEADD(day,-1,GETDATE()),101)


USE Northwind
DECLARE @Ident int
INSERT INTO Orders
(CustomerID,OrderDate)
VALUES
('ALFKI', DATEADD(day,-1,GETDATE()))
SELECT @Ident = @@IDENTITY
INSERT INTO [Order Details]
(OrderID, ProductID, UnitPrice, Quantity)
VALUES
(@Ident, 1, 50, 25)
SELECT 'The OrderID of the INSERTed row is ' + CONVERT(varchar(8),@Ident)

C:\>TYPE c:\WczorajszeZamowienia.txt

/* Dynamiczny SQL: tworzenie kodu w locie przy uyciu polecenia EXEC */

USE Northwind
GO

--Utwrz tabel. Przeniesiemy informacje z tego miejsca do dynamicznego SQL
CREATE TABLE DynamicSQLExample
(
   TableID   int   IDENTITY   NOT NULL
      CONSTRAINT PKDynamicSQLExample
            PRIMARY KEY,
   TableName varchar(128)   NOT NULL
)
GO

/* Wypenij tabel. W tym przypadku przechwytujemy wszystkie nazwy tabel z bazy Northwind . */
INSERT INTO DynamicSQLExample
SELECT TABLE_NAME
   FROM Information_Schema.Tables
   WHERE TABLE_TYPE = 'BASE TABLE'

/* Na pocztku zadeklaruj zmienn do przechowywania nazwy tabeli.
** Pamitaj, e nazwa obiektu nie moe by dusza ni 128 znakw */
DECLARE @TableName   varchar(128)

-- Przechwy nazw tabeli odpowiadajc identyfikatorowi
SELECT @TableName = TableName
   FROM DynamicSQLExample
   WHERE TableID = 14

-- Wreszcie przenie warto do instrukcji EXEC 
EXEC ('SELECT * FROM ' + @TableName)

/* Zastosowania EXEC */

USE Northwind --Przykad bdny
/* Na pocztek zadeklaruj zmienne. Pierwsza dla danych dla instrukcji EXEC, druga, do ktrej by moe trafi dane wynikowe (nie trafi) */
DECLARE @InVar   varchar(50)
DECLARE @OurVar   varchar(50)
-- Ustaw acuch do przekazania dla polecenia EXEC
SET @InVar = 'SELECT @OutVar = FirstName FROM Employees WHERE EmployeeID = 1'
-- Uruchom
EXEC (@InVar)
-- Teraz w celu pokazania, e nie bdzie adnej rnicy, uruchom bez uycia zmiennej
EXEC ('SELECT @OutVar = FirstName FROM Employees WHERE EmployeeID = 1')
-- @OutVar pozostanie zerowe, poniewa nie byo co do niego przypisa
SELECT @OutVar


USE Northwind
-- Tym razem potrzebujemy tylko jednej zmiennej. Musi ona by jednak dusza.
DECLARE @InVar varchar(200)
/* Ustaw acuch do przekazania dla polecenia EXEC. Tym razem przetworzy on kilka polece na raz. Zostan one wykonane jako jeden batch*/
SET @InVar = 'DECLARE @OutVar varchar(50)
            SELECT @OutVar = FirstName FROM Employees WHERE EmployeeID = 1
            SELECT ''The Value Is '' + @OutVar'
-- Uruchmom
EXEC (@Invar)


USE Northwind
EXEC('SELECT * FROM Customers')
SELECT 'The Rowcount is ' + CAST(@@ROWCOUNT as varchar)

/* Wykorzystanie zoenia funkcji a instrukcja EXEC */

USE Northwind

-- To nie zadziaa
DECLARE @NumberOfLetters int
SET @NumberOfLetters = 15
EXEC('SELECT LEFT(CompanyName,' + CAST(@NumberOfLeters AS varchar) + ') AS
ShortName
FROM Customers')
GO

-- Ale to zadziaa
DECLARE @NumberOfLetters AS int
SET @NumberOfLetters = 15
DECLARE @str AS varchar(255)
SET @str = 'SELECT LEFT(CompanyName,' + CAST(@NumberOfLetters AS varchar) + ') AS
ShortName FROM Customers'
EXEC(@str)
