KEMBAR78
T sql denali code Day of .Net
USE DENALI_DEMO;
GO

--Create a SEQUENCE
IF EXISTS(SELECT * FROM sys.objects WHERE NAME =
'mySequence')
    DROP SEQUENCE mySequence

CREATE SEQUENCE mySequence AS
    BIGINT --TINYINT, SMALLINT, BIGINT, DECIMAL and
NUMERIC (0 scale)
    START WITH 1
    INCREMENT BY 1;

--Select values from the sequence
SELECT NEXT VALUE FOR mySequence;
SELECT NEXT VALUE FOR mySequence;

/*
CREATE SEQUENCE [schema_name . ] sequence_name
        [ <sequence_property_assignment> [ ,…n ] ]
    [ ; ]

<sequence_property_assignment>::=
{
    [ AS { built_in_integer_type | user-
defined_integer_type } ]
    | START WITH <constant>
        | INCREMENT BY <constant>
        | { MINVALUE <constant> | NO MINVALUE }
        | { MAXVALUE <constant> | NO MAXVALUE }
        | { CYCLE | NO CYCLE }
        | { CACHE [<constant> ] | NO CACHE }
}
*/
IF EXISTS(SELECT * FROM sys.objects WHERE name =
'test1')
    DROP SEQUENCE test1;
CREATE SEQUENCE test1;

SELECT NEXT VALUE FOR test1;
SELECT NEXT VALUE FOR mySequence;

--View Properties of the sequences
SELECT * FROM sys.sequences;


--Restart
ALTER SEQUENCE mySequence RESTART WITH 1;
--Use in a query, numbers in order of ProductID
SELECT NEXT VALUE FOR mySequence OVER(ORDER BY
ProductID) AS SEQ,
    Name, ProductID
FROM AdventureWorks2008R2.Production.Product
ORDER BY ProductID;

--Numbers in order of ProductID, but sort results
--by Name
ALTER SEQUENCE mySequence RESTART WITH 1;

SELECT NEXT VALUE FOR mySequence OVER(ORDER BY
ProductID) AS SEQ,
    Name, ProductID
FROM AdventureWorks2008R2.Production.Product
ORDER BY Name;

DROP SEQUENCE TEST2
CREATE SEQUENCE TEST2
--Multiple tables, columns
TRUNCATE TABLE Table1; -- one int column
TRUNCATE TABLE Table2; -- two int columns

INSERT INTO Table1(Col1,Seq1)
VALUES('A',NEXT VALUE FOR mySequence)

INSERT INTO Table2(Col1,Seq1,Seq2)
VALUES('B',NEXT VALUE FOR mySequence, NEXT VALUE FOR
mySequence),
      ('C',NEXT VALUE FOR mySequence, NEXT VALUE FOR
test1);

SELECT Col1, Seq1 FROM Table1;
SELECT Col1, Seq1, Seq2 FROM Table2;



--Cycling
IF EXISTS(SELECT * FROM sys.objects WHERE name =
'myCount')
    DROP SEQUENCE myCount;

CREATE SEQUENCE myCount
    AS tinyint
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 5
    CYCLE;

SELECT NEXT VALUE FOR myCount OVER(ORDER BY ProductID)
AS SEQ,
    Name, ProductID
FROM AdventureWorks2008R2.Production.Product
ORDER BY ProductID;

--Use in a transaction
TRUNCATE TABLE TestTable;
--What is the next number?
SELECT name, current_value FROM sys.sequences
WHERE name = 'mySequence';

BEGIN TRANSACTION
    INSERT INTO TestTable(Col1, Col2)
    VALUES('a',NEXT VALUE FOR mySequence),
          ('b',NEXT VALUE FOR mySequence),
          ('c',NEXT VALUE FOR mySequence);
ROLLBACK
SELECT name, current_value FROM sys.sequences
WHERE name = 'mySequence';


--PERMISSION
GRANT INSERT, UPDATE, SELECT ON Table1 TO testuser

EXECUTE AS LOGIN = 'testuser'
GO
INSERT INTO Table1 SELECT 'f',1000

--try to use the sequence object
INSERT INTO Table1 SELECT 'g',NEXT VALUE FOR
mySequence

REVERT
GRANT UPDATE ON mySequence TO testuser;

EXECUTE AS LOGIN = 'testuser';
GO
INSERT INTO Table1 SELECT 'g',NEXT VALUE FOR
mySequence;

REVERT;

DECLARE @range_first_value_output sql_variant,
        @range_last_value_output sql_variant;

EXEC sp_sequence_get_range
@sequence_name = N'mySequence'
, @range_size = 30
, @range_first_value = @range_first_value_output
OUTPUT
, @range_last_value = @range_last_value_output OUTPUT
;

SELECT @range_first_value_output AS FirstNumber,
    @range_last_value_output AS LastNumber;
--END SEQUENCE




--Ad-hoc Query Paging
USE AdventureWorks2008R2;
GO
SELECT Name, ProductID
FROM Production.Product
ORDER BY ProductID;

--Get rows 6 and on
SELECT Name, ProductID
FROM Production.Product
ORDER BY ProductID OFFSET 5 ROWS;
--Start with 6th rows and fetch only 10
SELECT Name, ProductID
FROM Production.Product
ORDER BY ProductID OFFSET 5 ROWS FETCH NEXT 10 ROWS
ONLY;

--END PAGING



--THROW
USE DENALI_DEMO
GO

--THROW
THROW 500001,'an error message',10

create table Table_PK(Col1 int primary key)
--inside TRY/CATCH
BEGIN TRY
    INSERT INTO Table_PK(COl1) VALUES(1);
    INSERT INTO Table_PK(COl1) VALUES(1);
END TRY
BEGIN CATCH
    INSERT INTO
ERROR_LOG(ErrorDate,ErrorNumber,ErrorMessage)
    VALUES(getdate(),ERROR_NUMBER(),ERROR_MESSAGE());
    THROW;
END CATCH
--END THROW
--WITH RESULT SETS
EXECUTE ('SELECT 1,2')
WITH RESULT SETS(
    (Column1 int NOT NULL)
    );

EXECUTE('SELECT 1')
WITH RESULT SETS NONE;

EXECUTE(
'EXECUTE(''SELECT 1 AS COL1'')
WITH RESULT SETS UNDEFINED;')
WITH Result sets undefined;

EXEC AdventureWorks2008R2.Production.ProductList
'%Chain%'

EXEC AdventureWorks2008R2.Production.ProductList
'%Chain%'
WITH RESULT SETS (
    ([Product Number] int,
     [Product Name] nvarchar(50),
     [List Price] money),
    ([Product Name] nvarchar(50),
     [Number of Orders] int)
     );
--END WITH RESULT SETS
--SYS.SP_DESCRIBE_FIRST_RESULT_SET

--old command returns colum names but not data
USE AdventureWorks2008R2;
GO
SET FMTONLY ON;
GO
SELECT *
FROM AdventureWorks2008R2.HumanResources.Employee;
SET FMTONLY OFF;

EXEC sys.sp_describe_first_result_set
    N'SELECT * FROM
AdventureWorks2008R2.HumanResources.Employee;';

--Has two result sets, but first is always known
EXEC AdventureWorks2008R2.Production.ProductList
'%Chain%';

EXEC sys.sp_describe_first_result_set
    N'AdventureWorks2008R2.Production.ProductList
''%Chain%''';

EXEC sys.sp_describe_first_result_set
    N'IF (1=1) BEGIN
        EXEC
AdventureWorks2008R2.Production.ProductList
''%Chain%''
    END
    ELSE BEGIN
EXEC
AdventureWorks2008R2.dbo.uspGetBillOfMaterials 1
    END';
--END describe first result set




--Date/Time functions
--Date Time from Parts
SELECT DATEFROMPARTS(2011,8,6);
SELECT DATETIME2FROMPARTS(2011,8,6,14,30,59,12345,7);

--End of month
SELECT EOMONTH(GETDATE());
--END Date/Time

--Conversion functions
--PARSE ( string_value AS data_type [ USING culture ]
)
SELECT PARSE('August 6, 2011' AS SMALLDATETIME);
SELECT PARSE('ABCDE' AS SMALLDATETIME);

--TRY_PARSE ( string_value AS data_type [ USING
culture ] )
SELECT TRY_PARSE('August 6, 2011' AS SMALLDATETIME);
SELECT TRY_PARSE('ABCDE' AS SMALLDATETIME);

--TRY_CONVERT ( data_type [ ( length ) ], expression
[, style ] )
SELECT CONVERT(VARCHAR,GETDATE(),101);
SELECT CONVERT(INT,'123');
SELECT CONVERT(INT, 'ABC');
SELECT TRY_CONVERT(INT, 'ABC');
--END CONVERSION
--Logical Functions
--IIF
--Current CASE
SELECT CASE WHEN 1 = 2 THEN '1 equals 2' ELSE '1 does
not equal 2' END;
SELECT IIF(1 = 2, '1 equals 2','1 does not equal 2');

Use AdventureWorks2008R2;
GO
SELECT ProductID, IIF(Color IS NOT NULL,Color, 'No
color recorded') AS Color
FROM Production.Product;

--CHOOSE
SELECT ProductID, CHOOSE(ProductID % 3 +
1,'Apples','Oranges','Pears')
FROM Production.Product;
--END Logical functions



--String functions
--CONCAT
SELECT ProductID, Color, Size, Color + ' ' + Size
FROM Production.Product
WHERE Color IS NOT NULL OR Size IS NOT NULL;

SELECT ProductID, Color, Size, CONCAT(Color,' ',Size)
FROM Production.Product
WHERE Color IS NOT NULL OR Size IS NOT NULL;

--FORMAT
SELECT FORMAT(GETDATE(),'MM/dd/yyyy');
SELECT FORMAT(GETDATE(),'MMMM dd, yyyy');
SELECT FORMAT(1234,'C');
--END String functions




--END




String functions

CONCAT (Transact-SQL)


FORMAT (Transact-SQL)
--OFFSET



/*
--NEAR
USE AdventureWorks2008R2;
GO
SELECT DocumentNode,Title
FROM Production.Document
WHERE CONTAINS(Document,'Reflector NEAR Assembly');

SELECT DocumentNode,Title
FROM Production.Document
WHERE CONTAINS(Document,'NEAR((Reflector,
Assembly),5)');

SELECT DocumentNode, Title, Document, KEY_TBL.RANK
FROM Production.Document AS DocTable INNER JOIN
CONTAINSTABLE(Production.Document, Document,
'(Reflector NEAR Assembly)' ) AS KEY_TBL
ON DocTable.DocumentNode = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK;

--must be in order
SELECT DocumentNode,Title
FROM Production.Document
WHERE CONTAINS(Document,'NEAR((Reflector, Assembly),5,
TRUE)');

--END
*/

/*
--Compare to TOP, but TOP doesn't have a skip option
SET STATISTICS IO ON;

SELECT TOP(1000) Name, ProductID
FROM Production.Product
ORDER BY Name;

SELECT Name, ProductID
FROM Production.Product
ORDER BY Name OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY;

SET STATISTICS IO OFF;
*/

/*
--Paging example from BOL, with an enhancement!
-- Ensure the database can support the snapshot
isolation level set for the query.
IF (SELECT snapshot_isolation_state FROM sys.databases
WHERE name = N'AdventureWorks2008R2') = 0
    ALTER DATABASE AdventureWorks2008R2 SET
ALLOW_SNAPSHOT_ISOLATION ON;
GO

-- Set the transaction isolation level to SNAPSHOT
for this query.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO

-- Beging the transaction
BEGIN TRANSACTION;
GO
-- Declare and set the variables for the OFFSET and
FETCH values.
DECLARE @StartingRowNumber int = 1
      , @RowCountPerPage int = 3;

-- Create the condition to stop the transaction after
all rows have been returned.
WHILE (SELECT COUNT(*) FROM HumanResources.Department)
>= @StartingRowNumber
BEGIN

-- Run the query until the stop condition is met.
SELECT DepartmentID, Name, GroupName, COUNT(*)
OVER()/@RowCountPerPage AS TotalPages
FROM HumanResources.Department
ORDER BY DepartmentID ASC
    OFFSET @StartingRowNumber - 1 ROWS
    FETCH NEXT @RowCountPerPage ROWS ONLY;

-- Increment @StartingRowNumber value.
SET @StartingRowNumber = @StartingRowNumber +
@RowCountPerPage;
CONTINUE
END;
GO
COMMIT TRANSACTION;

GO;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

*/

/*

USE AdventureWorks2008R2;
GO
SELECT BusinessEntityID, TerritoryID
   ,DATEPART(yy,ModifiedDate) AS SalesYear
   ,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
   ,CONVERT(varchar(20),AVG(SalesYTD) OVER (PARTITION
BY TerritoryID
                                             ORDER BY
DATEPART(yy,ModifiedDate)
                                           ),1) AS
MovingAvg
   ,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION
BY TerritoryID
                                             ORDER BY
DATEPART(yy,ModifiedDate)
                                             ),1) AS
CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY TerritoryID,SalesYear;
*/

T sql denali code Day of .Net

  • 1.
    USE DENALI_DEMO; GO --Create aSEQUENCE IF EXISTS(SELECT * FROM sys.objects WHERE NAME = 'mySequence') DROP SEQUENCE mySequence CREATE SEQUENCE mySequence AS BIGINT --TINYINT, SMALLINT, BIGINT, DECIMAL and NUMERIC (0 scale) START WITH 1 INCREMENT BY 1; --Select values from the sequence SELECT NEXT VALUE FOR mySequence; SELECT NEXT VALUE FOR mySequence; /* CREATE SEQUENCE [schema_name . ] sequence_name [ <sequence_property_assignment> [ ,…n ] ] [ ; ] <sequence_property_assignment>::= { [ AS { built_in_integer_type | user- defined_integer_type } ] | START WITH <constant> | INCREMENT BY <constant> | { MINVALUE <constant> | NO MINVALUE } | { MAXVALUE <constant> | NO MAXVALUE } | { CYCLE | NO CYCLE } | { CACHE [<constant> ] | NO CACHE } } */
  • 2.
    IF EXISTS(SELECT *FROM sys.objects WHERE name = 'test1') DROP SEQUENCE test1; CREATE SEQUENCE test1; SELECT NEXT VALUE FOR test1; SELECT NEXT VALUE FOR mySequence; --View Properties of the sequences SELECT * FROM sys.sequences; --Restart ALTER SEQUENCE mySequence RESTART WITH 1; --Use in a query, numbers in order of ProductID SELECT NEXT VALUE FOR mySequence OVER(ORDER BY ProductID) AS SEQ, Name, ProductID FROM AdventureWorks2008R2.Production.Product ORDER BY ProductID; --Numbers in order of ProductID, but sort results --by Name ALTER SEQUENCE mySequence RESTART WITH 1; SELECT NEXT VALUE FOR mySequence OVER(ORDER BY ProductID) AS SEQ, Name, ProductID FROM AdventureWorks2008R2.Production.Product ORDER BY Name; DROP SEQUENCE TEST2 CREATE SEQUENCE TEST2
  • 3.
    --Multiple tables, columns TRUNCATETABLE Table1; -- one int column TRUNCATE TABLE Table2; -- two int columns INSERT INTO Table1(Col1,Seq1) VALUES('A',NEXT VALUE FOR mySequence) INSERT INTO Table2(Col1,Seq1,Seq2) VALUES('B',NEXT VALUE FOR mySequence, NEXT VALUE FOR mySequence), ('C',NEXT VALUE FOR mySequence, NEXT VALUE FOR test1); SELECT Col1, Seq1 FROM Table1; SELECT Col1, Seq1, Seq2 FROM Table2; --Cycling IF EXISTS(SELECT * FROM sys.objects WHERE name = 'myCount') DROP SEQUENCE myCount; CREATE SEQUENCE myCount AS tinyint START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 5 CYCLE; SELECT NEXT VALUE FOR myCount OVER(ORDER BY ProductID) AS SEQ, Name, ProductID FROM AdventureWorks2008R2.Production.Product
  • 4.
    ORDER BY ProductID; --Usein a transaction TRUNCATE TABLE TestTable; --What is the next number? SELECT name, current_value FROM sys.sequences WHERE name = 'mySequence'; BEGIN TRANSACTION INSERT INTO TestTable(Col1, Col2) VALUES('a',NEXT VALUE FOR mySequence), ('b',NEXT VALUE FOR mySequence), ('c',NEXT VALUE FOR mySequence); ROLLBACK SELECT name, current_value FROM sys.sequences WHERE name = 'mySequence'; --PERMISSION GRANT INSERT, UPDATE, SELECT ON Table1 TO testuser EXECUTE AS LOGIN = 'testuser' GO INSERT INTO Table1 SELECT 'f',1000 --try to use the sequence object INSERT INTO Table1 SELECT 'g',NEXT VALUE FOR mySequence REVERT GRANT UPDATE ON mySequence TO testuser; EXECUTE AS LOGIN = 'testuser'; GO
  • 5.
    INSERT INTO Table1SELECT 'g',NEXT VALUE FOR mySequence; REVERT; DECLARE @range_first_value_output sql_variant, @range_last_value_output sql_variant; EXEC sp_sequence_get_range @sequence_name = N'mySequence' , @range_size = 30 , @range_first_value = @range_first_value_output OUTPUT , @range_last_value = @range_last_value_output OUTPUT ; SELECT @range_first_value_output AS FirstNumber, @range_last_value_output AS LastNumber; --END SEQUENCE --Ad-hoc Query Paging USE AdventureWorks2008R2; GO SELECT Name, ProductID FROM Production.Product ORDER BY ProductID; --Get rows 6 and on SELECT Name, ProductID FROM Production.Product ORDER BY ProductID OFFSET 5 ROWS;
  • 6.
    --Start with 6throws and fetch only 10 SELECT Name, ProductID FROM Production.Product ORDER BY ProductID OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; --END PAGING --THROW USE DENALI_DEMO GO --THROW THROW 500001,'an error message',10 create table Table_PK(Col1 int primary key) --inside TRY/CATCH BEGIN TRY INSERT INTO Table_PK(COl1) VALUES(1); INSERT INTO Table_PK(COl1) VALUES(1); END TRY BEGIN CATCH INSERT INTO ERROR_LOG(ErrorDate,ErrorNumber,ErrorMessage) VALUES(getdate(),ERROR_NUMBER(),ERROR_MESSAGE()); THROW; END CATCH --END THROW
  • 7.
    --WITH RESULT SETS EXECUTE('SELECT 1,2') WITH RESULT SETS( (Column1 int NOT NULL) ); EXECUTE('SELECT 1') WITH RESULT SETS NONE; EXECUTE( 'EXECUTE(''SELECT 1 AS COL1'') WITH RESULT SETS UNDEFINED;') WITH Result sets undefined; EXEC AdventureWorks2008R2.Production.ProductList '%Chain%' EXEC AdventureWorks2008R2.Production.ProductList '%Chain%' WITH RESULT SETS ( ([Product Number] int, [Product Name] nvarchar(50), [List Price] money), ([Product Name] nvarchar(50), [Number of Orders] int) ); --END WITH RESULT SETS
  • 8.
    --SYS.SP_DESCRIBE_FIRST_RESULT_SET --old command returnscolum names but not data USE AdventureWorks2008R2; GO SET FMTONLY ON; GO SELECT * FROM AdventureWorks2008R2.HumanResources.Employee; SET FMTONLY OFF; EXEC sys.sp_describe_first_result_set N'SELECT * FROM AdventureWorks2008R2.HumanResources.Employee;'; --Has two result sets, but first is always known EXEC AdventureWorks2008R2.Production.ProductList '%Chain%'; EXEC sys.sp_describe_first_result_set N'AdventureWorks2008R2.Production.ProductList ''%Chain%'''; EXEC sys.sp_describe_first_result_set N'IF (1=1) BEGIN EXEC AdventureWorks2008R2.Production.ProductList ''%Chain%'' END ELSE BEGIN
  • 9.
    EXEC AdventureWorks2008R2.dbo.uspGetBillOfMaterials 1 END'; --END describe first result set --Date/Time functions --Date Time from Parts SELECT DATEFROMPARTS(2011,8,6); SELECT DATETIME2FROMPARTS(2011,8,6,14,30,59,12345,7); --End of month SELECT EOMONTH(GETDATE()); --END Date/Time --Conversion functions --PARSE ( string_value AS data_type [ USING culture ] ) SELECT PARSE('August 6, 2011' AS SMALLDATETIME); SELECT PARSE('ABCDE' AS SMALLDATETIME); --TRY_PARSE ( string_value AS data_type [ USING culture ] ) SELECT TRY_PARSE('August 6, 2011' AS SMALLDATETIME); SELECT TRY_PARSE('ABCDE' AS SMALLDATETIME); --TRY_CONVERT ( data_type [ ( length ) ], expression [, style ] ) SELECT CONVERT(VARCHAR,GETDATE(),101); SELECT CONVERT(INT,'123'); SELECT CONVERT(INT, 'ABC'); SELECT TRY_CONVERT(INT, 'ABC'); --END CONVERSION
  • 10.
    --Logical Functions --IIF --Current CASE SELECTCASE WHEN 1 = 2 THEN '1 equals 2' ELSE '1 does not equal 2' END; SELECT IIF(1 = 2, '1 equals 2','1 does not equal 2'); Use AdventureWorks2008R2; GO SELECT ProductID, IIF(Color IS NOT NULL,Color, 'No color recorded') AS Color FROM Production.Product; --CHOOSE SELECT ProductID, CHOOSE(ProductID % 3 + 1,'Apples','Oranges','Pears') FROM Production.Product; --END Logical functions --String functions --CONCAT SELECT ProductID, Color, Size, Color + ' ' + Size FROM Production.Product WHERE Color IS NOT NULL OR Size IS NOT NULL; SELECT ProductID, Color, Size, CONCAT(Color,' ',Size) FROM Production.Product WHERE Color IS NOT NULL OR Size IS NOT NULL; --FORMAT SELECT FORMAT(GETDATE(),'MM/dd/yyyy');
  • 11.
    SELECT FORMAT(GETDATE(),'MMMM dd,yyyy'); SELECT FORMAT(1234,'C'); --END String functions --END String functions CONCAT (Transact-SQL) FORMAT (Transact-SQL)
  • 12.
    --OFFSET /* --NEAR USE AdventureWorks2008R2; GO SELECT DocumentNode,Title FROMProduction.Document WHERE CONTAINS(Document,'Reflector NEAR Assembly'); SELECT DocumentNode,Title FROM Production.Document WHERE CONTAINS(Document,'NEAR((Reflector, Assembly),5)'); SELECT DocumentNode, Title, Document, KEY_TBL.RANK FROM Production.Document AS DocTable INNER JOIN CONTAINSTABLE(Production.Document, Document, '(Reflector NEAR Assembly)' ) AS KEY_TBL
  • 13.
    ON DocTable.DocumentNode =KEY_TBL.[KEY] ORDER BY KEY_TBL.RANK; --must be in order SELECT DocumentNode,Title FROM Production.Document WHERE CONTAINS(Document,'NEAR((Reflector, Assembly),5, TRUE)'); --END */ /* --Compare to TOP, but TOP doesn't have a skip option SET STATISTICS IO ON; SELECT TOP(1000) Name, ProductID FROM Production.Product ORDER BY Name; SELECT Name, ProductID FROM Production.Product ORDER BY Name OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY; SET STATISTICS IO OFF; */ /* --Paging example from BOL, with an enhancement! -- Ensure the database can support the snapshot isolation level set for the query. IF (SELECT snapshot_isolation_state FROM sys.databases WHERE name = N'AdventureWorks2008R2') = 0 ALTER DATABASE AdventureWorks2008R2 SET ALLOW_SNAPSHOT_ISOLATION ON;
  • 14.
    GO -- Set thetransaction isolation level to SNAPSHOT for this query. SET TRANSACTION ISOLATION LEVEL SNAPSHOT; GO -- Beging the transaction BEGIN TRANSACTION; GO -- Declare and set the variables for the OFFSET and FETCH values. DECLARE @StartingRowNumber int = 1 , @RowCountPerPage int = 3; -- Create the condition to stop the transaction after all rows have been returned. WHILE (SELECT COUNT(*) FROM HumanResources.Department) >= @StartingRowNumber BEGIN -- Run the query until the stop condition is met. SELECT DepartmentID, Name, GroupName, COUNT(*) OVER()/@RowCountPerPage AS TotalPages FROM HumanResources.Department ORDER BY DepartmentID ASC OFFSET @StartingRowNumber - 1 ROWS FETCH NEXT @RowCountPerPage ROWS ONLY; -- Increment @StartingRowNumber value. SET @StartingRowNumber = @StartingRowNumber + @RowCountPerPage; CONTINUE END; GO
  • 15.
    COMMIT TRANSACTION; GO; SET TRANSACTIONISOLATION LEVEL READ COMMITTED; */ /* USE AdventureWorks2008R2; GO SELECT BusinessEntityID, TerritoryID ,DATEPART(yy,ModifiedDate) AS SalesYear ,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD ,CONVERT(varchar(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID ORDER BY DATEPART(yy,ModifiedDate) ),1) AS MovingAvg ,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID ORDER BY DATEPART(yy,ModifiedDate) ),1) AS CumulativeTotal FROM Sales.SalesPerson WHERE TerritoryID IS NULL OR TerritoryID < 5 ORDER BY TerritoryID,SalesYear; */