From 64d63fa045be5e6061d469f44b8cbd1f2244edb1 Mon Sep 17 00:00:00 2001 From: Apress Date: Tue, 11 Oct 2016 01:06:59 +0100 Subject: [PATCH] First commit --- 1-59059-720-6/Chapter01/readme.txt | 6 +++ 1-59059-720-6/Chapter02/ReadMe.txt | 1 + 1-59059-720-6/Chapter03/CREATE DATABASE.sql | 10 ++++ 1-59059-720-6/Chapter04/1-CREATE AJMASON.sql | 5 ++ 1-59059-720-6/Chapter04/2-ALTER LOGIN.sql | 3 ++ 1-59059-720-6/Chapter04/3-CREATE USER.sql | 2 + .../4-CREATE SCHEMA Transactions.sql | 3 ++ .../Chapter05/1.CustomerDetails.Customers.sql | Bin 0 -> 2104 bytes .../Chapter05/2-TransactionDetails.sql | 10 ++++ .../Chapter05/3-TransactionTypes.sql | 14 ++++++ 1-59059-720-6/Chapter05/4-AlterTable.sql | 3 ++ 1-59059-720-6/Chapter05/5-RemainingTables.sql | 33 +++++++++++++ 1-59059-720-6/Chapter05/6-PrimaryKey.sql | 10 ++++ 1-59059-720-6/Chapter05/7-foreignKey.sql | 7 +++ 1-59059-720-6/Chapter06/1-CustomerIndex.sql | 8 ++++ 1-59059-720-6/Chapter06/2-OtherIndexes.sql | 30 ++++++++++++ 1-59059-720-6/Chapter06/3.Drop-Index.sql | 13 ++++++ .../4.ShareDetails.SharePrices-Index.sql | 12 +++++ 1-59059-720-6/Chapter07/1.SetDBOffline.sql | 4 ++ .../Chapter07/10.RestoreLogT-SQL.sql | 4 ++ 1-59059-720-6/Chapter07/11.DetachTSQL.sql | Bin 0 -> 98 bytes 1-59059-720-6/Chapter07/12.AttachTSQL.sql | Bin 0 -> 280 bytes 1-59059-720-6/Chapter07/2.SetDBOnline.sql | 4 ++ 1-59059-720-6/Chapter07/3.FullBackup.sql | 6 +++ .../Chapter07/4.DifferentialBackup.sql | 10 ++++ 1-59059-720-6/Chapter07/5.VerifyBackup.sql | 17 +++++++ .../Chapter07/6.BackupTransactionLog.sql | 6 +++ 1-59059-720-6/Chapter07/7.SetRecoveryMode.sql | 15 ++++++ .../8.AlterTablePriorToTSQLRestore.sql | 4 ++ .../Chapter07/9.RestoreT-SQLPart1.sql | 7 +++ .../Chapter08/1.InsertShareDetails.Shares.sql | 10 ++++ .../Chapter08/10.SELECT 3 Columns.sql | 2 + 1-59059-720-6/Chapter08/11.SELECTAlias.sql | 4 ++ .../12.InsertShareDetails.Shares.sql | 12 +++++ .../Chapter08/13.SELECTSpecificCompany.sql | 3 ++ 1-59059-720-6/Chapter08/14.SELECTRanger.sql | 7 +++ 1-59059-720-6/Chapter08/15.SELECTRowcount.sql | 4 ++ .../Chapter08/16.SELECTTopVRowcount.sql | 5 ++ .../Chapter08/17.SELECTConcatenation.sql | 3 ++ .../Chapter08/18.SELECTConcatenationALIAS.sql | 3 ++ .../Chapter08/19.SELECTWithOrder.sql | 4 ++ .../2.FixupCustomerDetails.Customers.sql | 12 +++++ .../Chapter08/20.SELECTWithOrderDESC.sql | 4 ++ 1-59059-720-6/Chapter08/21.SELECTWithLIKE.sql | 3 ++ .../Chapter08/22.SELECTWithLIKE2.sql | 3 ++ 1-59059-720-6/Chapter08/23.SELECT-ERROR.sql | 3 ++ 1-59059-720-6/Chapter08/24.SELECTINTO.sql | 4 ++ 1-59059-720-6/Chapter08/25-UpdateToBrodie.sql | 3 ++ 1-59059-720-6/Chapter08/26-RetrieveBrodie.sql | 2 + .../Chapter08/27-UPDATEbackToMcGlynn.sql | 8 ++++ .../Chapter08/28-SELECTMcGlynnAgain.sql | 4 ++ .../Chapter08/29-UpdateClearedBalance.sql | 5 ++ ...traintCustomerDetails.CustomerProducts.sql | 7 +++ 1-59059-720-6/Chapter08/30-SelectCustomer.sql | 5 ++ 1-59059-720-6/Chapter08/31-DataTypeError.sql | 7 +++ .../Chapter08/32-UPDATESharesInTran.sql | 14 ++++++ .../Chapter08/33-UPDATERollbackTran.sql | 17 +++++++ .../Chapter08/34 - NestedTransTrancount.sql | 13 ++++++ 1-59059-720-6/Chapter08/35-RollbackDELETE.sql | 13 ++++++ .../Chapter08/36-Delete3Rollback.sql | 6 +++ .../Chapter08/37-TruncateCustomers.sql | 1 + ...raint.CustomerDetails.CustomerProducts.sql | 5 ++ ...raint.CustomerDetails.CustomerProducts.sql | 4 ++ ....CHECKCustomerDetails.CustomerProducts.sql | 4 ++ 1-59059-720-6/Chapter08/7.MultipleINSERTs.sql | 17 +++++++ 1-59059-720-6/Chapter08/8.SelectTOP3.sql | 2 + 1-59059-720-6/Chapter08/9.SELECTALL.sql | 1 + 1-59059-720-6/Chapter08/readme.txt | 4 ++ .../Chapter09/1.ShareDetails.Shares.view.sql | Bin 0 -> 860 bytes .../Chapter09/10.CREATE INDEX on view.sql | 3 ++ .../2.ShareDetails.vw_SharePrices.sql | Bin 0 -> 880 bytes .../Chapter09/3-insert-shareprices.sql | 18 +++++++ .../Chapter09/4.CustTrans-TSQL-Test.sql | Bin 0 -> 766 bytes .../5.CustomerDetails.vw_CustTrans.sql | Bin 0 -> 890 bytes .../6.Predata required for SCHEMA view.sql | Bin 0 -> 2426 bytes .../Chapter09/7.SCHEMABINDING TestCode.sql | 6 +++ ....SCHEMABINDING View vw_CustFinProducts.sql | 13 ++++++ .../Chapter09/9.DROPandRECREATE of view.sql | Bin 0 -> 1444 bytes 1-59059-720-6/Chapter09/readme.txt | 4 ++ .../00-DemonstratingValueInOUTPUT.sql | 23 +++++++++ .../1.FirstStoredProcedureCreation.sql | 23 +++++++++ .../Chapter10/2.RunningFirstProcedure.sql | 1 + .../Chapter10/3.RunningSecondProcedure.sql | 3 ++ .../Chapter10/4.SecondProcedureWithOUTPUT.sql | 37 +++++++++++++++ 1-59059-720-6/Chapter10/5.BREAK.sql | 14 ++++++ 1-59059-720-6/Chapter10/6.CASE-2-Example.sql | 7 +++ 1-59059-720-6/Chapter10/6.CASEExample.sql | 15 ++++++ .../Chapter10/7.FinalExampleAllTogether.sql | 44 ++++++++++++++++++ 1-59059-720-6/Chapter10/readme.txt | 4 ++ 1-59059-720-6/Chapter11/1-JOIN.sql | 3 ++ .../Chapter11/10-Variables-2batches.sql | 7 +++ .../Chapter11/11-Variables-MultipleRows.sql | 7 +++ 1-59059-720-6/Chapter11/12-TempTable.sql | 9 ++++ .../Chapter11/13-GlobalTempTable.sql | 9 ++++ 1-59059-720-6/Chapter11/13.Count.sql | 2 + 1-59059-720-6/Chapter11/14.CountFilter.sql | 3 ++ 1-59059-720-6/Chapter11/15-Sum.sql | 4 ++ 1-59059-720-6/Chapter11/16-MaxMin.sql | 3 ++ 1-59059-720-6/Chapter11/17-AVG.sql | 3 ++ 1-59059-720-6/Chapter11/18-GROUPBY.sql | 4 ++ 1-59059-720-6/Chapter11/19-GROUPBY-2.sql | 5 ++ .../Chapter11/2-JOINonTwoColumns.sql | 4 ++ 1-59059-720-6/Chapter11/20-HAVING.sql | 6 +++ 1-59059-720-6/Chapter11/21-PREDISTINCT.sql | 3 ++ 1-59059-720-6/Chapter11/22-DISTINCT-1.sql | 3 ++ 1-59059-720-6/Chapter11/23-DISTINCT-2.sql | 3 ++ 1-59059-720-6/Chapter11/24-DATEADD.sql | 3 ++ .../Chapter11/25-DATEADD-SUBTRACTION.sql | 3 ++ 1-59059-720-6/Chapter11/26-DATEDIFF.sql | 4 ++ 1-59059-720-6/Chapter11/27-DATENAME.sql | 3 ++ 1-59059-720-6/Chapter11/28-DATEPART.sql | 3 ++ 1-59059-720-6/Chapter11/29-DATEFormatted.sql | 7 +++ 1-59059-720-6/Chapter11/3.LEFT-OUTERJOIN.sql | 3 ++ 1-59059-720-6/Chapter11/30-ASCII.sql | 3 ++ 1-59059-720-6/Chapter11/31-CHAR.sql | 3 ++ 1-59059-720-6/Chapter11/32-CHAR-2.sql | 3 ++ 1-59059-720-6/Chapter11/33-LEFT.sql | 3 ++ 1-59059-720-6/Chapter11/34-Lower.sql | 3 ++ 1-59059-720-6/Chapter11/35-LTRIM.sql | 3 ++ 1-59059-720-6/Chapter11/36-RIGHT.sql | 3 ++ 1-59059-720-6/Chapter11/37-RTRIM.sql | 3 ++ 1-59059-720-6/Chapter11/38-STR.sql | 1 + 1-59059-720-6/Chapter11/39-LTRIM-AND-STR.sql | 1 + .../4.LEFT-OUTERJOIN-WithNoPrice.sql | 4 ++ 1-59059-720-6/Chapter11/40-SUBSTRING.sql | 3 ++ 1-59059-720-6/Chapter11/41-UPPER.sql | 3 ++ 1-59059-720-6/Chapter11/42-CASE.sql | 6 +++ 1-59059-720-6/Chapter11/43-CAST.sql | 3 ++ 1-59059-720-6/Chapter11/44-CONVERT.sql | 3 ++ 1-59059-720-6/Chapter11/45-ISDATE.sql | 3 ++ 1-59059-720-6/Chapter11/46-ISDATe-VALID.sql | 3 ++ 1-59059-720-6/Chapter11/47-ISNULL.sql | 3 ++ .../Chapter11/48-ISNUMERIC-FALSE.sql | 3 ++ 1-59059-720-6/Chapter11/49-ISNUMERIC-TRUE.sql | 3 ++ 1-59059-720-6/Chapter11/5.RIGHT-OUTERJOIN.sql | 3 ++ 1-59059-720-6/Chapter11/50-spaddmessage.sql | 2 + .../Chapter11/51-CustomerOverdrawn.sql | 1 + .../Chapter11/52-sp_addmessage_chage.sql | 2 + .../Chapter11/53-RAISEERROR-improved.sql | 1 + 1-59059-720-6/Chapter11/54-DOUBLE-@@ERROR.sql | 3 ++ .../Chapter11/55-RAISERROR-With-@@ERROR.sql | 2 + .../Chapter11/56-RAISERROR-Severity11.sql | 2 + 1-59059-720-6/Chapter11/57-TryCatch-1.sql | 10 ++++ 1-59059-720-6/Chapter11/58-TryCatch-2.sql | 16 +++++++ 1-59059-720-6/Chapter11/59-TryCatch-3.sql | 15 ++++++ 1-59059-720-6/Chapter11/6-InsertForTest.sql | 3 ++ .../Chapter11/60-TryCatch-LocalVariable.sql | 19 ++++++++ 1-59059-720-6/Chapter11/7-Full-OUTERJOIN.sql | 3 ++ 1-59059-720-6/Chapter11/8-CROSS-JOIN.sql | 3 ++ 1-59059-720-6/Chapter11/9-Variables.sql | 6 +++ 1-59059-720-6/Chapter11/readme.txt | 4 ++ .../Chapter12/1-MaxSharePriceExample.sql | 13 ++++++ 1-59059-720-6/Chapter12/10-CTE-NoCTE.sql | 16 +++++++ 1-59059-720-6/Chapter12/11-CTE-WithCTE.sql | 13 ++++++ 1-59059-720-6/Chapter12/12-Recursive-CTE.sql | 43 +++++++++++++++++ 1-59059-720-6/Chapter12/13-Pre-PIVOT.sql | 7 +++ 1-59059-720-6/Chapter12/14-PIVOT.sql | 11 +++++ .../Chapter12/15-UNPIVOT-Into-TEMP.sql | 14 ++++++ 1-59059-720-6/Chapter12/16-ROW_NUMBER.sql | 7 +++ 1-59059-720-6/Chapter12/17-RowNum-2.sql | 8 ++++ 1-59059-720-6/Chapter12/18-Rank.sql | 7 +++ 1-59059-720-6/Chapter12/19-DenseRank.sql | 7 +++ .../Chapter12/2-Correlated-Subquery.sql | 11 +++++ 1-59059-720-6/Chapter12/20-NTile.sql | 5 ++ 1-59059-720-6/Chapter12/21-sp_tableoption.sql | 2 + 1-59059-720-6/Chapter12/22-LOB-1.sql | 3 ++ 1-59059-720-6/Chapter12/23-LOB-Select.sql | 1 + .../Chapter12/24-LOB-Update-Dolphins.sql | 3 ++ 1-59059-720-6/Chapter12/25-Update-Raiders.sql | 3 ++ 1-59059-720-6/Chapter12/26-Select-Raiders.sql | 1 + 1-59059-720-6/Chapter12/27-Image-LOB.sql | 5 ++ 1-59059-720-6/Chapter12/28-UpdateImage.sql | 6 +++ .../Chapter12/3-Backup-ReferenceONLY.sql | 22 +++++++++ 1-59059-720-6/Chapter12/4-IN.sql | 3 ++ 1-59059-720-6/Chapter12/5-IN-Subquery.sql | 8 ++++ 1-59059-720-6/Chapter12/6-IN-OR.sql | 5 ++ 1-59059-720-6/Chapter12/7-NOT-EXISTS.sql | 5 ++ 1-59059-720-6/Chapter12/8-CROSS-APPLY.sql | 27 +++++++++++ 1-59059-720-6/Chapter12/9-OUTER-APPLY.sql | 7 +++ 1-59059-720-6/Chapter12/readme.txt | 4 ++ 1-59059-720-6/Chapter13/1-Create Trigger.sql | 17 +++++++ .../Chapter13/10-Test-AlterUpdate.sql | 15 ++++++ .../Chapter13/12-COLUMNS-UPDATED.sql | 35 ++++++++++++++ 1-59059-720-6/Chapter13/13-DDL Trigger.sql | 14 ++++++ .../Chapter13/14-Test-DDL-Trigger.sql | 3 ++ .../Chapter13/15-Drop-DDL-Trigger.sql | 1 + .../Chapter13/16-CreateSecondDDLTrigger.sql | 5 ++ 1-59059-720-6/Chapter13/17-Test-DDL-2.sql | 3 ++ 1-59059-720-6/Chapter13/2-Test Trigger.sql | 9 ++++ 1-59059-720-6/Chapter13/3-Noncash Test.sql | 9 ++++ .../4-InspectingTransactionDetails.sql | 3 ++ 1-59059-720-6/Chapter13/5-AlterTrigger.sql | 16 +++++++ 1-59059-720-6/Chapter13/6-NonCash-Retest.sql | 9 ++++ 1-59059-720-6/Chapter13/7-UPDATE-Trigger.sql | 28 +++++++++++ 1-59059-720-6/Chapter13/8-Test-UPDATE.sql | 15 ++++++ 1-59059-720-6/Chapter13/9-AlterUPDATE.sql | 34 ++++++++++++++ 1-59059-720-6/Chapter14/1-ReportStructure.sql | 8 ++++ 3354.pdf | Bin 0 -> 2298313 bytes 3434.pdf | Bin 0 -> 996886 bytes 9781590597200.jpg | Bin 0 -> 11177 bytes LICENSE.txt | 27 +++++++++++ README.md | 15 ++++++ contributing.md | 14 ++++++ 203 files changed, 1499 insertions(+) create mode 100644 1-59059-720-6/Chapter01/readme.txt create mode 100644 1-59059-720-6/Chapter02/ReadMe.txt create mode 100644 1-59059-720-6/Chapter03/CREATE DATABASE.sql create mode 100644 1-59059-720-6/Chapter04/1-CREATE AJMASON.sql create mode 100644 1-59059-720-6/Chapter04/2-ALTER LOGIN.sql create mode 100644 1-59059-720-6/Chapter04/3-CREATE USER.sql create mode 100644 1-59059-720-6/Chapter04/4-CREATE SCHEMA Transactions.sql create mode 100644 1-59059-720-6/Chapter05/1.CustomerDetails.Customers.sql create mode 100644 1-59059-720-6/Chapter05/2-TransactionDetails.sql create mode 100644 1-59059-720-6/Chapter05/3-TransactionTypes.sql create mode 100644 1-59059-720-6/Chapter05/4-AlterTable.sql create mode 100644 1-59059-720-6/Chapter05/5-RemainingTables.sql create mode 100644 1-59059-720-6/Chapter05/6-PrimaryKey.sql create mode 100644 1-59059-720-6/Chapter05/7-foreignKey.sql create mode 100644 1-59059-720-6/Chapter06/1-CustomerIndex.sql create mode 100644 1-59059-720-6/Chapter06/2-OtherIndexes.sql create mode 100644 1-59059-720-6/Chapter06/3.Drop-Index.sql create mode 100644 1-59059-720-6/Chapter06/4.ShareDetails.SharePrices-Index.sql create mode 100644 1-59059-720-6/Chapter07/1.SetDBOffline.sql create mode 100644 1-59059-720-6/Chapter07/10.RestoreLogT-SQL.sql create mode 100644 1-59059-720-6/Chapter07/11.DetachTSQL.sql create mode 100644 1-59059-720-6/Chapter07/12.AttachTSQL.sql create mode 100644 1-59059-720-6/Chapter07/2.SetDBOnline.sql create mode 100644 1-59059-720-6/Chapter07/3.FullBackup.sql create mode 100644 1-59059-720-6/Chapter07/4.DifferentialBackup.sql create mode 100644 1-59059-720-6/Chapter07/5.VerifyBackup.sql create mode 100644 1-59059-720-6/Chapter07/6.BackupTransactionLog.sql create mode 100644 1-59059-720-6/Chapter07/7.SetRecoveryMode.sql create mode 100644 1-59059-720-6/Chapter07/8.AlterTablePriorToTSQLRestore.sql create mode 100644 1-59059-720-6/Chapter07/9.RestoreT-SQLPart1.sql create mode 100644 1-59059-720-6/Chapter08/1.InsertShareDetails.Shares.sql create mode 100644 1-59059-720-6/Chapter08/10.SELECT 3 Columns.sql create mode 100644 1-59059-720-6/Chapter08/11.SELECTAlias.sql create mode 100644 1-59059-720-6/Chapter08/12.InsertShareDetails.Shares.sql create mode 100644 1-59059-720-6/Chapter08/13.SELECTSpecificCompany.sql create mode 100644 1-59059-720-6/Chapter08/14.SELECTRanger.sql create mode 100644 1-59059-720-6/Chapter08/15.SELECTRowcount.sql create mode 100644 1-59059-720-6/Chapter08/16.SELECTTopVRowcount.sql create mode 100644 1-59059-720-6/Chapter08/17.SELECTConcatenation.sql create mode 100644 1-59059-720-6/Chapter08/18.SELECTConcatenationALIAS.sql create mode 100644 1-59059-720-6/Chapter08/19.SELECTWithOrder.sql create mode 100644 1-59059-720-6/Chapter08/2.FixupCustomerDetails.Customers.sql create mode 100644 1-59059-720-6/Chapter08/20.SELECTWithOrderDESC.sql create mode 100644 1-59059-720-6/Chapter08/21.SELECTWithLIKE.sql create mode 100644 1-59059-720-6/Chapter08/22.SELECTWithLIKE2.sql create mode 100644 1-59059-720-6/Chapter08/23.SELECT-ERROR.sql create mode 100644 1-59059-720-6/Chapter08/24.SELECTINTO.sql create mode 100644 1-59059-720-6/Chapter08/25-UpdateToBrodie.sql create mode 100644 1-59059-720-6/Chapter08/26-RetrieveBrodie.sql create mode 100644 1-59059-720-6/Chapter08/27-UPDATEbackToMcGlynn.sql create mode 100644 1-59059-720-6/Chapter08/28-SELECTMcGlynnAgain.sql create mode 100644 1-59059-720-6/Chapter08/29-UpdateClearedBalance.sql create mode 100644 1-59059-720-6/Chapter08/3.ConstraintCustomerDetails.CustomerProducts.sql create mode 100644 1-59059-720-6/Chapter08/30-SelectCustomer.sql create mode 100644 1-59059-720-6/Chapter08/31-DataTypeError.sql create mode 100644 1-59059-720-6/Chapter08/32-UPDATESharesInTran.sql create mode 100644 1-59059-720-6/Chapter08/33-UPDATERollbackTran.sql create mode 100644 1-59059-720-6/Chapter08/34 - NestedTransTrancount.sql create mode 100644 1-59059-720-6/Chapter08/35-RollbackDELETE.sql create mode 100644 1-59059-720-6/Chapter08/36-Delete3Rollback.sql create mode 100644 1-59059-720-6/Chapter08/37-TruncateCustomers.sql create mode 100644 1-59059-720-6/Chapter08/4.CheckConstraint.CustomerDetails.CustomerProducts.sql create mode 100644 1-59059-720-6/Chapter08/5.DefaultConstraint.CustomerDetails.CustomerProducts.sql create mode 100644 1-59059-720-6/Chapter08/6.CHECKCustomerDetails.CustomerProducts.sql create mode 100644 1-59059-720-6/Chapter08/7.MultipleINSERTs.sql create mode 100644 1-59059-720-6/Chapter08/8.SelectTOP3.sql create mode 100644 1-59059-720-6/Chapter08/9.SELECTALL.sql create mode 100644 1-59059-720-6/Chapter08/readme.txt create mode 100644 1-59059-720-6/Chapter09/1.ShareDetails.Shares.view.sql create mode 100644 1-59059-720-6/Chapter09/10.CREATE INDEX on view.sql create mode 100644 1-59059-720-6/Chapter09/2.ShareDetails.vw_SharePrices.sql create mode 100644 1-59059-720-6/Chapter09/3-insert-shareprices.sql create mode 100644 1-59059-720-6/Chapter09/4.CustTrans-TSQL-Test.sql create mode 100644 1-59059-720-6/Chapter09/5.CustomerDetails.vw_CustTrans.sql create mode 100644 1-59059-720-6/Chapter09/6.Predata required for SCHEMA view.sql create mode 100644 1-59059-720-6/Chapter09/7.SCHEMABINDING TestCode.sql create mode 100644 1-59059-720-6/Chapter09/8.SCHEMABINDING View vw_CustFinProducts.sql create mode 100644 1-59059-720-6/Chapter09/9.DROPandRECREATE of view.sql create mode 100644 1-59059-720-6/Chapter09/readme.txt create mode 100644 1-59059-720-6/Chapter10/00-DemonstratingValueInOUTPUT.sql create mode 100644 1-59059-720-6/Chapter10/1.FirstStoredProcedureCreation.sql create mode 100644 1-59059-720-6/Chapter10/2.RunningFirstProcedure.sql create mode 100644 1-59059-720-6/Chapter10/3.RunningSecondProcedure.sql create mode 100644 1-59059-720-6/Chapter10/4.SecondProcedureWithOUTPUT.sql create mode 100644 1-59059-720-6/Chapter10/5.BREAK.sql create mode 100644 1-59059-720-6/Chapter10/6.CASE-2-Example.sql create mode 100644 1-59059-720-6/Chapter10/6.CASEExample.sql create mode 100644 1-59059-720-6/Chapter10/7.FinalExampleAllTogether.sql create mode 100644 1-59059-720-6/Chapter10/readme.txt create mode 100644 1-59059-720-6/Chapter11/1-JOIN.sql create mode 100644 1-59059-720-6/Chapter11/10-Variables-2batches.sql create mode 100644 1-59059-720-6/Chapter11/11-Variables-MultipleRows.sql create mode 100644 1-59059-720-6/Chapter11/12-TempTable.sql create mode 100644 1-59059-720-6/Chapter11/13-GlobalTempTable.sql create mode 100644 1-59059-720-6/Chapter11/13.Count.sql create mode 100644 1-59059-720-6/Chapter11/14.CountFilter.sql create mode 100644 1-59059-720-6/Chapter11/15-Sum.sql create mode 100644 1-59059-720-6/Chapter11/16-MaxMin.sql create mode 100644 1-59059-720-6/Chapter11/17-AVG.sql create mode 100644 1-59059-720-6/Chapter11/18-GROUPBY.sql create mode 100644 1-59059-720-6/Chapter11/19-GROUPBY-2.sql create mode 100644 1-59059-720-6/Chapter11/2-JOINonTwoColumns.sql create mode 100644 1-59059-720-6/Chapter11/20-HAVING.sql create mode 100644 1-59059-720-6/Chapter11/21-PREDISTINCT.sql create mode 100644 1-59059-720-6/Chapter11/22-DISTINCT-1.sql create mode 100644 1-59059-720-6/Chapter11/23-DISTINCT-2.sql create mode 100644 1-59059-720-6/Chapter11/24-DATEADD.sql create mode 100644 1-59059-720-6/Chapter11/25-DATEADD-SUBTRACTION.sql create mode 100644 1-59059-720-6/Chapter11/26-DATEDIFF.sql create mode 100644 1-59059-720-6/Chapter11/27-DATENAME.sql create mode 100644 1-59059-720-6/Chapter11/28-DATEPART.sql create mode 100644 1-59059-720-6/Chapter11/29-DATEFormatted.sql create mode 100644 1-59059-720-6/Chapter11/3.LEFT-OUTERJOIN.sql create mode 100644 1-59059-720-6/Chapter11/30-ASCII.sql create mode 100644 1-59059-720-6/Chapter11/31-CHAR.sql create mode 100644 1-59059-720-6/Chapter11/32-CHAR-2.sql create mode 100644 1-59059-720-6/Chapter11/33-LEFT.sql create mode 100644 1-59059-720-6/Chapter11/34-Lower.sql create mode 100644 1-59059-720-6/Chapter11/35-LTRIM.sql create mode 100644 1-59059-720-6/Chapter11/36-RIGHT.sql create mode 100644 1-59059-720-6/Chapter11/37-RTRIM.sql create mode 100644 1-59059-720-6/Chapter11/38-STR.sql create mode 100644 1-59059-720-6/Chapter11/39-LTRIM-AND-STR.sql create mode 100644 1-59059-720-6/Chapter11/4.LEFT-OUTERJOIN-WithNoPrice.sql create mode 100644 1-59059-720-6/Chapter11/40-SUBSTRING.sql create mode 100644 1-59059-720-6/Chapter11/41-UPPER.sql create mode 100644 1-59059-720-6/Chapter11/42-CASE.sql create mode 100644 1-59059-720-6/Chapter11/43-CAST.sql create mode 100644 1-59059-720-6/Chapter11/44-CONVERT.sql create mode 100644 1-59059-720-6/Chapter11/45-ISDATE.sql create mode 100644 1-59059-720-6/Chapter11/46-ISDATe-VALID.sql create mode 100644 1-59059-720-6/Chapter11/47-ISNULL.sql create mode 100644 1-59059-720-6/Chapter11/48-ISNUMERIC-FALSE.sql create mode 100644 1-59059-720-6/Chapter11/49-ISNUMERIC-TRUE.sql create mode 100644 1-59059-720-6/Chapter11/5.RIGHT-OUTERJOIN.sql create mode 100644 1-59059-720-6/Chapter11/50-spaddmessage.sql create mode 100644 1-59059-720-6/Chapter11/51-CustomerOverdrawn.sql create mode 100644 1-59059-720-6/Chapter11/52-sp_addmessage_chage.sql create mode 100644 1-59059-720-6/Chapter11/53-RAISEERROR-improved.sql create mode 100644 1-59059-720-6/Chapter11/54-DOUBLE-@@ERROR.sql create mode 100644 1-59059-720-6/Chapter11/55-RAISERROR-With-@@ERROR.sql create mode 100644 1-59059-720-6/Chapter11/56-RAISERROR-Severity11.sql create mode 100644 1-59059-720-6/Chapter11/57-TryCatch-1.sql create mode 100644 1-59059-720-6/Chapter11/58-TryCatch-2.sql create mode 100644 1-59059-720-6/Chapter11/59-TryCatch-3.sql create mode 100644 1-59059-720-6/Chapter11/6-InsertForTest.sql create mode 100644 1-59059-720-6/Chapter11/60-TryCatch-LocalVariable.sql create mode 100644 1-59059-720-6/Chapter11/7-Full-OUTERJOIN.sql create mode 100644 1-59059-720-6/Chapter11/8-CROSS-JOIN.sql create mode 100644 1-59059-720-6/Chapter11/9-Variables.sql create mode 100644 1-59059-720-6/Chapter11/readme.txt create mode 100644 1-59059-720-6/Chapter12/1-MaxSharePriceExample.sql create mode 100644 1-59059-720-6/Chapter12/10-CTE-NoCTE.sql create mode 100644 1-59059-720-6/Chapter12/11-CTE-WithCTE.sql create mode 100644 1-59059-720-6/Chapter12/12-Recursive-CTE.sql create mode 100644 1-59059-720-6/Chapter12/13-Pre-PIVOT.sql create mode 100644 1-59059-720-6/Chapter12/14-PIVOT.sql create mode 100644 1-59059-720-6/Chapter12/15-UNPIVOT-Into-TEMP.sql create mode 100644 1-59059-720-6/Chapter12/16-ROW_NUMBER.sql create mode 100644 1-59059-720-6/Chapter12/17-RowNum-2.sql create mode 100644 1-59059-720-6/Chapter12/18-Rank.sql create mode 100644 1-59059-720-6/Chapter12/19-DenseRank.sql create mode 100644 1-59059-720-6/Chapter12/2-Correlated-Subquery.sql create mode 100644 1-59059-720-6/Chapter12/20-NTile.sql create mode 100644 1-59059-720-6/Chapter12/21-sp_tableoption.sql create mode 100644 1-59059-720-6/Chapter12/22-LOB-1.sql create mode 100644 1-59059-720-6/Chapter12/23-LOB-Select.sql create mode 100644 1-59059-720-6/Chapter12/24-LOB-Update-Dolphins.sql create mode 100644 1-59059-720-6/Chapter12/25-Update-Raiders.sql create mode 100644 1-59059-720-6/Chapter12/26-Select-Raiders.sql create mode 100644 1-59059-720-6/Chapter12/27-Image-LOB.sql create mode 100644 1-59059-720-6/Chapter12/28-UpdateImage.sql create mode 100644 1-59059-720-6/Chapter12/3-Backup-ReferenceONLY.sql create mode 100644 1-59059-720-6/Chapter12/4-IN.sql create mode 100644 1-59059-720-6/Chapter12/5-IN-Subquery.sql create mode 100644 1-59059-720-6/Chapter12/6-IN-OR.sql create mode 100644 1-59059-720-6/Chapter12/7-NOT-EXISTS.sql create mode 100644 1-59059-720-6/Chapter12/8-CROSS-APPLY.sql create mode 100644 1-59059-720-6/Chapter12/9-OUTER-APPLY.sql create mode 100644 1-59059-720-6/Chapter12/readme.txt create mode 100644 1-59059-720-6/Chapter13/1-Create Trigger.sql create mode 100644 1-59059-720-6/Chapter13/10-Test-AlterUpdate.sql create mode 100644 1-59059-720-6/Chapter13/12-COLUMNS-UPDATED.sql create mode 100644 1-59059-720-6/Chapter13/13-DDL Trigger.sql create mode 100644 1-59059-720-6/Chapter13/14-Test-DDL-Trigger.sql create mode 100644 1-59059-720-6/Chapter13/15-Drop-DDL-Trigger.sql create mode 100644 1-59059-720-6/Chapter13/16-CreateSecondDDLTrigger.sql create mode 100644 1-59059-720-6/Chapter13/17-Test-DDL-2.sql create mode 100644 1-59059-720-6/Chapter13/2-Test Trigger.sql create mode 100644 1-59059-720-6/Chapter13/3-Noncash Test.sql create mode 100644 1-59059-720-6/Chapter13/4-InspectingTransactionDetails.sql create mode 100644 1-59059-720-6/Chapter13/5-AlterTrigger.sql create mode 100644 1-59059-720-6/Chapter13/6-NonCash-Retest.sql create mode 100644 1-59059-720-6/Chapter13/7-UPDATE-Trigger.sql create mode 100644 1-59059-720-6/Chapter13/8-Test-UPDATE.sql create mode 100644 1-59059-720-6/Chapter13/9-AlterUPDATE.sql create mode 100644 1-59059-720-6/Chapter14/1-ReportStructure.sql create mode 100644 3354.pdf create mode 100644 3434.pdf create mode 100644 9781590597200.jpg create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 contributing.md diff --git a/1-59059-720-6/Chapter01/readme.txt b/1-59059-720-6/Chapter01/readme.txt new file mode 100644 index 0000000..d90b020 --- /dev/null +++ b/1-59059-720-6/Chapter01/readme.txt @@ -0,0 +1,6 @@ +This chapter installs SQL Server and creates additional logon users + +There is no code within this chapter + +Robin Dewson +www.fat-belly.com \ No newline at end of file diff --git a/1-59059-720-6/Chapter02/ReadMe.txt b/1-59059-720-6/Chapter02/ReadMe.txt new file mode 100644 index 0000000..b179d7b --- /dev/null +++ b/1-59059-720-6/Chapter02/ReadMe.txt @@ -0,0 +1 @@ +No code \ No newline at end of file diff --git a/1-59059-720-6/Chapter03/CREATE DATABASE.sql b/1-59059-720-6/Chapter03/CREATE DATABASE.sql new file mode 100644 index 0000000..69bf4ac --- /dev/null +++ b/1-59059-720-6/Chapter03/CREATE DATABASE.sql @@ -0,0 +1,10 @@ +CREATE DATABASE ApressFinancial ON PRIMARY +( NAME = N'ApressFinancial', +FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ApressFinancial.mdf' , SIZE = 3072KB , +MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) +LOG ON +( NAME = 'ApressFinancial_log', +FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ApressFinancial_log.ldf' , +SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) +COLLATE SQL_Latin1_General_CP1_CI_AS +GO \ No newline at end of file diff --git a/1-59059-720-6/Chapter04/1-CREATE AJMASON.sql b/1-59059-720-6/Chapter04/1-CREATE AJMASON.sql new file mode 100644 index 0000000..ee58dd3 --- /dev/null +++ b/1-59059-720-6/Chapter04/1-CREATE AJMASON.sql @@ -0,0 +1,5 @@ +USE [master] +GO +CREATE LOGIN [XP-HOME\AJMason] +FROM WINDOWS +GO \ No newline at end of file diff --git a/1-59059-720-6/Chapter04/2-ALTER LOGIN.sql b/1-59059-720-6/Chapter04/2-ALTER LOGIN.sql new file mode 100644 index 0000000..584ad13 --- /dev/null +++ b/1-59059-720-6/Chapter04/2-ALTER LOGIN.sql @@ -0,0 +1,3 @@ +ALTER LOGIN [XP-HOME\AJMason] +WITH DEFAULT_DATABASE=ApressFinancial +GO \ No newline at end of file diff --git a/1-59059-720-6/Chapter04/3-CREATE USER.sql b/1-59059-720-6/Chapter04/3-CREATE USER.sql new file mode 100644 index 0000000..38e4a11 --- /dev/null +++ b/1-59059-720-6/Chapter04/3-CREATE USER.sql @@ -0,0 +1,2 @@ +CREATE USER [XP-HOME\AJMason] +FOR LOGIN [XP-HOME\AJMason] \ No newline at end of file diff --git a/1-59059-720-6/Chapter04/4-CREATE SCHEMA Transactions.sql b/1-59059-720-6/Chapter04/4-CREATE SCHEMA Transactions.sql new file mode 100644 index 0000000..6320e3a --- /dev/null +++ b/1-59059-720-6/Chapter04/4-CREATE SCHEMA Transactions.sql @@ -0,0 +1,3 @@ +USE ApressFinancial +GO +CREATE SCHEMA TransactionDetails AUTHORIZATION dbo \ No newline at end of file diff --git a/1-59059-720-6/Chapter05/1.CustomerDetails.Customers.sql b/1-59059-720-6/Chapter05/1.CustomerDetails.Customers.sql new file mode 100644 index 0000000000000000000000000000000000000000..50b0ebd1cfe458fdae76999928e11e374f6ebe34 GIT binary patch literal 2104 zcmd6o+iDY06o&s>1>a%rTBVq#*b4(f(`l>$P1;TZN+=RQkAROf2@TG5Nr2)G^U zE4(8uR6|;z4qQX{VwW9iiPVMWy5%O(8Q%pI6DU$-zeN8!joq6h8xfKdsPEtk;2yBX zuBoc3D$G}Wk95d5hT@2un(u4uUUO5nx8gpS-yQzc)k1z#eb%ntGa_!=oXQ^O)R)k- z;cH+;AFeZYEzV6aYqG!Ez#DSgK#y@5GIgDzB}0AP>s^uAck7;Pz^$pVBi94}iM}vr zpk-K=t?lTO_QB?W`J8_(_sZ4`gM+Q|J4jr3WD8A&j@{*0jwPNIE#hf;VK(-#_8aGf zh~M~njh)BD(yR=z(jt^&8R?Q!pJ^FkR#Z8iBWuP?xSetib>a6R2=w8#`0j3J8_72= zt%+3gJ*$W;KOfKDzs1Ecup0Zn(5#bSV%*&ani2^KMD53_Tv( z^QB70JXXHkx38lWT`DHi@+#b|Hmp-x*2nOjdfsN;H?N9Y5U`wHd6jHOs|(f0tMgw- z%R6lrMYApUYK)E6gRL6!+Rb~1^-V+HdZ<g-C-|IokT+=DLsJB|b4k=Tip6!Z)^ gjhmTG_awt{54>FwqW}N^ literal 0 HcmV?d00001 diff --git a/1-59059-720-6/Chapter07/12.AttachTSQL.sql b/1-59059-720-6/Chapter07/12.AttachTSQL.sql new file mode 100644 index 0000000000000000000000000000000000000000..b79f7a02e4d46c2f3a61408b7b313d664736aab9 GIT binary patch literal 280 zcmaKn%?iRW5QM+8;5&G$UJ70X4>h$YXw|mIT!OSxs6SZo@zqHXyh+&E&Cbqb^L`l$ zmLycd5oxFr7RqJlB;2@D)9YlkTyTn`Do4kV0XuRj$70uPq{*e-D$j{9%&_d`aOEU) zoHgrxy5MOw*~-oHy`teEzT_Y$pKCGCfPS+4GBH!R{_a+LJ1L#I|M!ihO7(ukB 'FAT-BELLY.COM' + +SELECT ShareDesc,CurrentPrice +FROM ShareDetails.Shares +WHERE NOT ShareDesc = 'FAT-BELLY.COM' diff --git a/1-59059-720-6/Chapter08/15.SELECTRowcount.sql b/1-59059-720-6/Chapter08/15.SELECTRowcount.sql new file mode 100644 index 0000000..75098e0 --- /dev/null +++ b/1-59059-720-6/Chapter08/15.SELECTRowcount.sql @@ -0,0 +1,4 @@ +SET ROWCOUNT 3 +SELECT * FROM ShareDetails.Shares +SET ROWCOUNT 0 +SELECT * FROM ShareDetails.Shares diff --git a/1-59059-720-6/Chapter08/16.SELECTTopVRowcount.sql b/1-59059-720-6/Chapter08/16.SELECTTopVRowcount.sql new file mode 100644 index 0000000..4c38d36 --- /dev/null +++ b/1-59059-720-6/Chapter08/16.SELECTTopVRowcount.sql @@ -0,0 +1,5 @@ +SELECT TOP 3 * FROM ShareDetails.Shares +SET ROWCOUNT 3 +SELECT TOP 2 * FROM ShareDetails.Shares +SET ROWCOUNT 2 +SELECT TOP 3 * FROM ShareDetails.Shares diff --git a/1-59059-720-6/Chapter08/17.SELECTConcatenation.sql b/1-59059-720-6/Chapter08/17.SELECTConcatenation.sql new file mode 100644 index 0000000..2dd8512 --- /dev/null +++ b/1-59059-720-6/Chapter08/17.SELECTConcatenation.sql @@ -0,0 +1,3 @@ +SELECT CustomerFirstName + ' ' + CustomerLastName AS 'Name', +ClearedBalance Balance +FROM CustomerDetails.Customers diff --git a/1-59059-720-6/Chapter08/18.SELECTConcatenationALIAS.sql b/1-59059-720-6/Chapter08/18.SELECTConcatenationALIAS.sql new file mode 100644 index 0000000..b825ada --- /dev/null +++ b/1-59059-720-6/Chapter08/18.SELECTConcatenationALIAS.sql @@ -0,0 +1,3 @@ +SELECT LEFT(CustomerFirstName + ' ' + CustomerLastName,50) AS 'Name', +ClearedBalance Balance +FROM CustomerDetails.Customers diff --git a/1-59059-720-6/Chapter08/19.SELECTWithOrder.sql b/1-59059-720-6/Chapter08/19.SELECTWithOrder.sql new file mode 100644 index 0000000..2bef6fc --- /dev/null +++ b/1-59059-720-6/Chapter08/19.SELECTWithOrder.sql @@ -0,0 +1,4 @@ +SELECT LEFT(CustomerFirstName + ' ' + CustomerLastName,50) AS 'Name', +ClearedBalance Balance +FROM CustomerDetails.Customers +ORDER BY Balance diff --git a/1-59059-720-6/Chapter08/2.FixupCustomerDetails.Customers.sql b/1-59059-720-6/Chapter08/2.FixupCustomerDetails.Customers.sql new file mode 100644 index 0000000..e32325b --- /dev/null +++ b/1-59059-720-6/Chapter08/2.FixupCustomerDetails.Customers.sql @@ -0,0 +1,12 @@ +DELETE FROM CustomerDetails.Customers +DBCC CHECKIDENT('CustomerDetails.Customers',RESEED,1) +INSERT INTO CustomerDetails.Customers +(CustomerTitleId,CustomerFirstName,CustomerOtherInitials, +CustomerLastName,AddressId,AccountNumber,AccountTypeId, +ClearedBalance,UnclearedBalance) +VALUES (1,'Vic',NULL,'McGlynn',111,87612311,1,4311.22,213.11) +INSERT INTO CustomerDetails.Customers +(CustomerTitleId,CustomerLastName,CustomerFirstName, +CustomerOtherInitials,AddressId,AccountNumber,AccountTypeId, +ClearedBalance,UnclearedBalance) +VALUES (3,'Mason','Jack',NULL,145,53431993,1,437.97,-10.56) diff --git a/1-59059-720-6/Chapter08/20.SELECTWithOrderDESC.sql b/1-59059-720-6/Chapter08/20.SELECTWithOrderDESC.sql new file mode 100644 index 0000000..9cbcf2f --- /dev/null +++ b/1-59059-720-6/Chapter08/20.SELECTWithOrderDESC.sql @@ -0,0 +1,4 @@ +SELECT LEFT(CustomerFirstName + ' ' + CustomerLastName,50) AS 'Name', +ClearedBalance Balance +FROM CustomerDetails.Customers +ORDER BY Balance DESC diff --git a/1-59059-720-6/Chapter08/21.SELECTWithLIKE.sql b/1-59059-720-6/Chapter08/21.SELECTWithLIKE.sql new file mode 100644 index 0000000..9015aaa --- /dev/null +++ b/1-59059-720-6/Chapter08/21.SELECTWithLIKE.sql @@ -0,0 +1,3 @@ +SELECT CustomerFirstName + ' ' + CustomerLastName +FROM CustomerDetails.Customers +WHERE CustomerLastName LIKE '%Glynn' diff --git a/1-59059-720-6/Chapter08/22.SELECTWithLIKE2.sql b/1-59059-720-6/Chapter08/22.SELECTWithLIKE2.sql new file mode 100644 index 0000000..44bbaa2 --- /dev/null +++ b/1-59059-720-6/Chapter08/22.SELECTWithLIKE2.sql @@ -0,0 +1,3 @@ +SELECT CustomerFirstName + ' ' + CustomerLastName AS [Name] +FROM CustomerDetails.Customers +WHERE CustomerFirstName + ' ' + CustomerLastName LIKE '%n%' diff --git a/1-59059-720-6/Chapter08/23.SELECT-ERROR.sql b/1-59059-720-6/Chapter08/23.SELECT-ERROR.sql new file mode 100644 index 0000000..fe708e9 --- /dev/null +++ b/1-59059-720-6/Chapter08/23.SELECT-ERROR.sql @@ -0,0 +1,3 @@ +SELECT CustomerFirstName + ' ' + CustomerLastName AS [Name] +FROM CustomerDetails.Customers +WHERE [Name] LIKE '%n%' diff --git a/1-59059-720-6/Chapter08/24.SELECTINTO.sql b/1-59059-720-6/Chapter08/24.SELECTINTO.sql new file mode 100644 index 0000000..4d2808b --- /dev/null +++ b/1-59059-720-6/Chapter08/24.SELECTINTO.sql @@ -0,0 +1,4 @@ +SELECT CustomerFirstName + ' ' + CustomerLastName AS [Name], +ClearedBalance,UnclearedBalance +INTO CustTemp +FROM CustomerDetails.Customers diff --git a/1-59059-720-6/Chapter08/25-UpdateToBrodie.sql b/1-59059-720-6/Chapter08/25-UpdateToBrodie.sql new file mode 100644 index 0000000..d2f6ccb --- /dev/null +++ b/1-59059-720-6/Chapter08/25-UpdateToBrodie.sql @@ -0,0 +1,3 @@ +UPDATE CustomerDetails.Customers +SET CustomerLastName = 'Brodie' +WHERE CustomerId = 1 diff --git a/1-59059-720-6/Chapter08/26-RetrieveBrodie.sql b/1-59059-720-6/Chapter08/26-RetrieveBrodie.sql new file mode 100644 index 0000000..3d0a8e8 --- /dev/null +++ b/1-59059-720-6/Chapter08/26-RetrieveBrodie.sql @@ -0,0 +1,2 @@ +SELECT * FROM CustomerDetails.Customers +WHERE CustomerId = 1 diff --git a/1-59059-720-6/Chapter08/27-UPDATEbackToMcGlynn.sql b/1-59059-720-6/Chapter08/27-UPDATEbackToMcGlynn.sql new file mode 100644 index 0000000..472cb0f --- /dev/null +++ b/1-59059-720-6/Chapter08/27-UPDATEbackToMcGlynn.sql @@ -0,0 +1,8 @@ +DECLARE @ValueToUpdate VARCHAR(30) +SET @ValueToUpdate = 'McGlynn' +UPDATE CustomerDetails.Customers + SET CustomerLastName = @ValueToUpdate, + ClearedBalance = ClearedBalance + UnclearedBalance , + UnclearedBalance = 0 + WHERE CustomerLastName = 'Brodie' + diff --git a/1-59059-720-6/Chapter08/28-SELECTMcGlynnAgain.sql b/1-59059-720-6/Chapter08/28-SELECTMcGlynnAgain.sql new file mode 100644 index 0000000..9777ee5 --- /dev/null +++ b/1-59059-720-6/Chapter08/28-SELECTMcGlynnAgain.sql @@ -0,0 +1,4 @@ +SELECT CustomerFirstName, CustomerLastName, +ClearedBalance, UnclearedBalance +FROM CustomerDetails.Customers +WHERE CustomerId = 1 diff --git a/1-59059-720-6/Chapter08/29-UpdateClearedBalance.sql b/1-59059-720-6/Chapter08/29-UpdateClearedBalance.sql new file mode 100644 index 0000000..161f6c7 --- /dev/null +++ b/1-59059-720-6/Chapter08/29-UpdateClearedBalance.sql @@ -0,0 +1,5 @@ +DECLARE @WrongDataType VARCHAR(20) +SET @WrongDataType = '4311.22' +UPDATE CustomerDetails.Customers + SET ClearedBalance = @WrongDataType +WHERE CustomerId = 1 diff --git a/1-59059-720-6/Chapter08/3.ConstraintCustomerDetails.CustomerProducts.sql b/1-59059-720-6/Chapter08/3.ConstraintCustomerDetails.CustomerProducts.sql new file mode 100644 index 0000000..063b640 --- /dev/null +++ b/1-59059-720-6/Chapter08/3.ConstraintCustomerDetails.CustomerProducts.sql @@ -0,0 +1,7 @@ +USE ApressFinancial +GO +ALTER TABLE CustomerDetails.CustomerProducts +ADD CONSTRAINT PK_CustomerProducts +PRIMARY KEY CLUSTERED +(CustomerFinancialProductId) ON [PRIMARY] +GO diff --git a/1-59059-720-6/Chapter08/30-SelectCustomer.sql b/1-59059-720-6/Chapter08/30-SelectCustomer.sql new file mode 100644 index 0000000..0b01a55 --- /dev/null +++ b/1-59059-720-6/Chapter08/30-SelectCustomer.sql @@ -0,0 +1,5 @@ +SELECT CustomerFirstName, CustomerLastName, +ClearedBalance, UnclearedBalance +FROM CustomerDetails.Customers +WHERE CustomerId = 1 + diff --git a/1-59059-720-6/Chapter08/31-DataTypeError.sql b/1-59059-720-6/Chapter08/31-DataTypeError.sql new file mode 100644 index 0000000..be07c18 --- /dev/null +++ b/1-59059-720-6/Chapter08/31-DataTypeError.sql @@ -0,0 +1,7 @@ +DECLARE @WrongDataType VARCHAR(20) +SET @WrongDataType = '2.0' +UPDATE CustomerDetails.Customers + SET AddressId = @WrongDataType +WHERE CustomerId = 1 + + diff --git a/1-59059-720-6/Chapter08/32-UPDATESharesInTran.sql b/1-59059-720-6/Chapter08/32-UPDATESharesInTran.sql new file mode 100644 index 0000000..1c216a4 --- /dev/null +++ b/1-59059-720-6/Chapter08/32-UPDATESharesInTran.sql @@ -0,0 +1,14 @@ +SELECT 'Before',ShareId,ShareDesc,CurrentPrice + FROM ShareDetails.Shares + WHERE ShareId = 3 +BEGIN TRAN ShareUpd +UPDATE ShareDetails.Shares + SET CurrentPrice = CurrentPrice * 1.1 + WHERE ShareId = 3 +COMMIT TRAN +SELECT 'After',ShareId,ShareDesc,CurrentPrice + FROM ShareDetails.Shares + WHERE ShareId = 3 + + + diff --git a/1-59059-720-6/Chapter08/33-UPDATERollbackTran.sql b/1-59059-720-6/Chapter08/33-UPDATERollbackTran.sql new file mode 100644 index 0000000..83b9f49 --- /dev/null +++ b/1-59059-720-6/Chapter08/33-UPDATERollbackTran.sql @@ -0,0 +1,17 @@ +SELECT 'Before',ShareId,ShareDesc,CurrentPrice + FROM ShareDetails.Shares +-- WHERE ShareId = 3 +BEGIN TRAN ShareUpd +UPDATE ShareDetails.Shares + SET CurrentPrice = CurrentPrice * 1.1 +-- WHERE ShareId = 3 +SELECT 'Within the transaction',ShareId,ShareDesc,CurrentPrice + FROM ShareDetails.Shares +ROLLBACK TRAN +SELECT 'After',ShareId,ShareDesc,CurrentPrice + FROM ShareDetails.Shares +-- WHERE ShareId = 3 + + + + diff --git a/1-59059-720-6/Chapter08/34 - NestedTransTrancount.sql b/1-59059-720-6/Chapter08/34 - NestedTransTrancount.sql new file mode 100644 index 0000000..37d3dec --- /dev/null +++ b/1-59059-720-6/Chapter08/34 - NestedTransTrancount.sql @@ -0,0 +1,13 @@ +BEGIN TRAN ShareUpd + SELECT '1st TranCount',@@TRANCOUNT + BEGIN TRAN ShareUpd2 + SELECT '2nd TranCount',@@TRANCOUNT + COMMIT TRAN ShareUpd2 + SELECT '3rd TranCount',@@TRANCOUNT +COMMIT TRAN -- It is at this point that data modifications will be committed +SELECT 'Last TranCount',@@TRANCOUNT + + + + + diff --git a/1-59059-720-6/Chapter08/35-RollbackDELETE.sql b/1-59059-720-6/Chapter08/35-RollbackDELETE.sql new file mode 100644 index 0000000..dcf4c3f --- /dev/null +++ b/1-59059-720-6/Chapter08/35-RollbackDELETE.sql @@ -0,0 +1,13 @@ +BEGIN TRAN + SELECT * FROM CustTemp + DELETE CustTemp + SELECT * FROM CustTemp +ROLLBACK TRAN +SELECT * FROM CustTemp + + + + + + + diff --git a/1-59059-720-6/Chapter08/36-Delete3Rollback.sql b/1-59059-720-6/Chapter08/36-Delete3Rollback.sql new file mode 100644 index 0000000..486202b --- /dev/null +++ b/1-59059-720-6/Chapter08/36-Delete3Rollback.sql @@ -0,0 +1,6 @@ +BEGIN TRAN + SELECT * FROM CustTemp + DELETE TOP (3) CustTemp + SELECT * FROM CustTemp +ROLLBACK TRAN +SELECT * FROM CustTemp diff --git a/1-59059-720-6/Chapter08/37-TruncateCustomers.sql b/1-59059-720-6/Chapter08/37-TruncateCustomers.sql new file mode 100644 index 0000000..9551dc4 --- /dev/null +++ b/1-59059-720-6/Chapter08/37-TruncateCustomers.sql @@ -0,0 +1 @@ +TRUNCATE TABLE CustomerDetails.Customers \ No newline at end of file diff --git a/1-59059-720-6/Chapter08/4.CheckConstraint.CustomerDetails.CustomerProducts.sql b/1-59059-720-6/Chapter08/4.CheckConstraint.CustomerDetails.CustomerProducts.sql new file mode 100644 index 0000000..d8886ee --- /dev/null +++ b/1-59059-720-6/Chapter08/4.CheckConstraint.CustomerDetails.CustomerProducts.sql @@ -0,0 +1,5 @@ +ALTER TABLE CustomerDetails.CustomerProducts +WITH NOCHECK +ADD CONSTRAINT CK_CustProds_AmtCheck +CHECK ((AmountToCollect > 0)) +GO diff --git a/1-59059-720-6/Chapter08/5.DefaultConstraint.CustomerDetails.CustomerProducts.sql b/1-59059-720-6/Chapter08/5.DefaultConstraint.CustomerDetails.CustomerProducts.sql new file mode 100644 index 0000000..dc10a60 --- /dev/null +++ b/1-59059-720-6/Chapter08/5.DefaultConstraint.CustomerDetails.CustomerProducts.sql @@ -0,0 +1,4 @@ +ALTER TABLE CustomerDetails.CustomerProducts WITH NOCHECK + ADD CONSTRAINT DF_CustProd_Renewable + DEFAULT (0) + FOR Renewable diff --git a/1-59059-720-6/Chapter08/6.CHECKCustomerDetails.CustomerProducts.sql b/1-59059-720-6/Chapter08/6.CHECKCustomerDetails.CustomerProducts.sql new file mode 100644 index 0000000..ed4d39f --- /dev/null +++ b/1-59059-720-6/Chapter08/6.CHECKCustomerDetails.CustomerProducts.sql @@ -0,0 +1,4 @@ +ALTER TABLE CustomerDetails.CustomerProducts ADD CONSTRAINT + CK_CustProd_LastColl CHECK ((LastCollection>=LastCollected)) +GO + diff --git a/1-59059-720-6/Chapter08/7.MultipleINSERTs.sql b/1-59059-720-6/Chapter08/7.MultipleINSERTs.sql new file mode 100644 index 0000000..7ae3f44 --- /dev/null +++ b/1-59059-720-6/Chapter08/7.MultipleINSERTs.sql @@ -0,0 +1,17 @@ +INSERT INTO CustomerDetails.Customers +(CustomerTitleId,CustomerFirstName,CustomerOtherInitials, +CustomerLastName,AddressId,AccountNumber,AccountTypeId, +ClearedBalance,UnclearedBalance) +VALUES (3,'Bernie','I','McGee',314,65368765,1,6653.11,0.00) +GO +INSERT INTO CustomerDetails.Customers +(CustomerTitleId,CustomerFirstName,CustomerOtherInitials, +CustomerLastName,AddressId,AccountNumber,AccountTypeId, +ClearedBalance,UnclearedBalance) +VALUES (2,'Julie','A','Dewson',2134,81625422,1,53.32,-12.21) +GO +INSERT INTO CustomerDetails.Customers +(CustomerTitleId,CustomerFirstName,CustomerOtherInitials, +CustomerLastName,AddressId,AccountNumber,AccountTypeId, +ClearedBalance,UnclearedBalance) +VALUES (1,'Kirsty',NULL,'Hull',4312,96565334,1,1266.00,10.32) diff --git a/1-59059-720-6/Chapter08/8.SelectTOP3.sql b/1-59059-720-6/Chapter08/8.SelectTOP3.sql new file mode 100644 index 0000000..eab8dc1 --- /dev/null +++ b/1-59059-720-6/Chapter08/8.SelectTOP3.sql @@ -0,0 +1,2 @@ +SELECT TOP (3) * +FROM CustomerDetails.Customers diff --git a/1-59059-720-6/Chapter08/9.SELECTALL.sql b/1-59059-720-6/Chapter08/9.SELECTALL.sql new file mode 100644 index 0000000..6ae6064 --- /dev/null +++ b/1-59059-720-6/Chapter08/9.SELECTALL.sql @@ -0,0 +1 @@ +SELECT * FROM CustomerDetails.Customers \ No newline at end of file diff --git a/1-59059-720-6/Chapter08/readme.txt b/1-59059-720-6/Chapter08/readme.txt new file mode 100644 index 0000000..a6c5e64 --- /dev/null +++ b/1-59059-720-6/Chapter08/readme.txt @@ -0,0 +1,4 @@ +This large chapter looked at how to inserting, updating, selecting and deleting data + +Robin Dewson +www.fat-belly.com \ No newline at end of file diff --git a/1-59059-720-6/Chapter09/1.ShareDetails.Shares.view.sql b/1-59059-720-6/Chapter09/1.ShareDetails.Shares.view.sql new file mode 100644 index 0000000000000000000000000000000000000000..5c107b53925622c404b6e863ef30f324498955db GIT binary patch literal 860 zcmaKr>rTQz5QWcg6W^i#iisic02;L5B@rQ%h=v%`K%+#hqy?3iSHD?8FF;H)-QC%l zb7s!&{{93SsG~Ct`Fpz4HRFicSfO4NDOIdCwqQQfn=(DB&hDqa^i+y5|Dg^*3f&lj zbAtsSd-*q1PkmN3HPz4&vnorb2|mN{9ILHUc<1oX^r1w@m7F2oiC(EMrSfT>TlQN< zpd}I3O9E2gVNO_WxW?2Pu@lqZ0&fwq?&<=Sdg`*X{Z;EPRH~Oc%bX%3U7?4mU0~Gy zsqBhoNrsIb-D3gqnO0aGn{#dvT1`Rtc0DI@dPRE2bD~@MC=imppWAn5)8b}C+>>RVGhnuG`X`)LqGxam)yi6DFnFM} y$dAE^85^z=t7%<9NH?Zqms_%7EJs)CEqJPTcsH}T#j|+{`y#6xyD!0a+W!H9k&Ac$ literal 0 HcmV?d00001 diff --git a/1-59059-720-6/Chapter09/10.CREATE INDEX on view.sql b/1-59059-720-6/Chapter09/10.CREATE INDEX on view.sql new file mode 100644 index 0000000..94b616d --- /dev/null +++ b/1-59059-720-6/Chapter09/10.CREATE INDEX on view.sql @@ -0,0 +1,3 @@ +CREATE UNIQUE CLUSTERED INDEX ix_CustFinProds +ON CustomerDetails.vw_CustFinProducts (AccountNumber, ProductName) + diff --git a/1-59059-720-6/Chapter09/2.ShareDetails.vw_SharePrices.sql b/1-59059-720-6/Chapter09/2.ShareDetails.vw_SharePrices.sql new file mode 100644 index 0000000000000000000000000000000000000000..efedc2b6342dd4f6e74cb5a44d0b22c61cb4b908 GIT binary patch literal 880 zcmbu7(Q3j#6h!B_;6LnR3nkPK@S!y-iYCE`MM^26LIcv4M%usEo*UGaYErB$>)yr5 z+?lz%SvNIQOZOV_>oiuE^O5RFsa`eJrxps?E9y*3<$6}YzhC;+%K;_n5H(%F znHFaXW1romhug1_VkO+JRo5NshB^T?1lLkjV9OK)C4B=Jb}DY+yX5;2zbo8S^ZZUB zCmTyECka#X0Y|2Hy%kBcaTjZ_&%mc~u2RRGB9`Ul)PvRTmb&NsyDIN`?90(3`d6mD zOILFk8kH=^oe!sN4CXS%cer)`pvl>cr)N|>YwyFqGMl%*?cR(lw57ac(`vheVmp5T Dy?2m^ literal 0 HcmV?d00001 diff --git a/1-59059-720-6/Chapter09/3-insert-shareprices.sql b/1-59059-720-6/Chapter09/3-insert-shareprices.sql new file mode 100644 index 0000000..854435d --- /dev/null +++ b/1-59059-720-6/Chapter09/3-insert-shareprices.sql @@ -0,0 +1,18 @@ +INSERT INTO ShareDetails.SharePrices (ShareId, Price, PriceDate) +VALUES (1,2.155,'1 Aug 2005 10:10AM') +INSERT INTO ShareDetails.SharePrices (ShareId, Price, PriceDate) +VALUES (1,2.2125,'1 Aug 2005 10:12AM') +INSERT INTO ShareDetails.SharePrices (ShareId, Price, PriceDate) +VALUES (1,2.4175,'1 Aug 2005 10:16AM') +INSERT INTO ShareDetails.SharePrices (ShareId, Price, PriceDate) +VALUES (1,2.21,'1 Aug 2005 11:22AM') +INSERT INTO ShareDetails.SharePrices (ShareId, Price, PriceDate) +VALUES (1,2.17,'1 Aug 2005 14:54') +INSERT INTO ShareDetails.SharePrices (ShareId, Price, PriceDate) +VALUES (1,2.34125,'1 Aug 2005 16:10') +INSERT INTO ShareDetails.SharePrices (ShareId, Price, PriceDate) +VALUES (2,41.10,'1 Aug 2005 10:10AM') +INSERT INTO ShareDetails.SharePrices (ShareId, Price, PriceDate) +VALUES (2,43.22,'2 Aug 2005 10:10AM') +INSERT INTO ShareDetails.SharePrices (ShareId, Price, PriceDate) +VALUES (2,45.20,'3 Aug 2005 10:10AM') \ No newline at end of file diff --git a/1-59059-720-6/Chapter09/4.CustTrans-TSQL-Test.sql b/1-59059-720-6/Chapter09/4.CustTrans-TSQL-Test.sql new file mode 100644 index 0000000000000000000000000000000000000000..e031a5f82d9f8c188568705e08c983a2bd5714b8 GIT binary patch literal 766 zcmb`F!A`IQh%-p%} z-kHAd7norAipDVeHNp&9cy_i8$h*z`xe_Zb?;9Sk`W3BNcxWg7Nve34T) zlQ}w9l;bt%hGV-Ms{WsvN;{@+n=n>y*OC2!s8;mhCUe>1S_ T1^yG)meM=)R|MxYoW1b@yrzku literal 0 HcmV?d00001 diff --git a/1-59059-720-6/Chapter09/5.CustomerDetails.vw_CustTrans.sql b/1-59059-720-6/Chapter09/5.CustomerDetails.vw_CustTrans.sql new file mode 100644 index 0000000000000000000000000000000000000000..12e8d2c57bde428440320f2ea5a5b8219577a376 GIT binary patch literal 890 zcmb`F(MrQW5Jm5^;6LmKgrFbbLrq(VXd-P}F?X z@7z1HpC5@P8fl;zYtWTa_G|tUy=bjQD=k#2){wQ)T$P^i$9mP9Zo8}*8FMX(9O?kH zsqa&;&anjafaSVmKh_an;D1Ezgf;Vc0qQ^n--_Bxs%7j8-Ff{8f85n;S&iXSJI{>z z#))K^WtE<+#F+It3@rMa)PiW1Z!quFCkkUQt`7TA9v+U0@yavl1 z$rNo@Owk&2g7wYDqNeD7*v#}!_iYl!YLnOQ$+dTWdG60O#yK+>`s)lj)ymY{S(|AE+?C-s@g+eB$( zf3|g=&E@}wtQzBK9LBUKR=D=Ntftn;4OHeSDWSN^w?J*N>M+LNs!CyDQ|HEw^wluu4=}D3a7xVMPMxl*?w9Ajx@ySjT#?3_DAAPB)UEz$$Q-d7>P{D0)r$7j@oQN>GQ%Og(jRo2m2>U?LQ-hw*?xkU5_Y%dio)A+~O-s>7~!!=7ow$Vj0 z!GDb0fj4ALeB_FDR8~dXe1EZ4w1ve__Er66t@6K#B+I|-&t!S%p@|fO--1o7zS@i~ z(hh&w3FY&!TgU~!38on6d-iyXGtpBDJmk#=;9X5ekk*tz$!7iX#Tr3|?Rjy2*m zIFGT*#yVdT>w6VB;|x6=5TOh10kMvVxra0+8}{8tXSs{8u+?(cX4dd?RI-%gWA&f- zo{6cgb&b-Bk7ru`nL{OgowWfcpo himI38WVKs{8CV+A@Ct@E;IkK_32Kr3*WQfa{R-tm=b-=q literal 0 HcmV?d00001 diff --git a/1-59059-720-6/Chapter09/readme.txt b/1-59059-720-6/Chapter09/readme.txt new file mode 100644 index 0000000..2de0408 --- /dev/null +++ b/1-59059-720-6/Chapter09/readme.txt @@ -0,0 +1,4 @@ +Here we deal with working with views + +Robin Dewson +www.fat-belly.com \ No newline at end of file diff --git a/1-59059-720-6/Chapter10/00-DemonstratingValueInOUTPUT.sql b/1-59059-720-6/Chapter10/00-DemonstratingValueInOUTPUT.sql new file mode 100644 index 0000000..e5ce019 --- /dev/null +++ b/1-59059-720-6/Chapter10/00-DemonstratingValueInOUTPUT.sql @@ -0,0 +1,23 @@ +use tempdb +go +create proc testparam(@a int,@b int output) +as +print 'Value of @b at start :' + cast(@b as varchar(10)) +select @b = @a + ISNULL(@b,0) +print 'Value of @b at end :' + cast(@b as varchar(10)) +return +go + +declare @a int ; set @a = 1 +declare @b int ; set @b = 5 +exec testparam @a,@b output +select @b + +/* +Value of @b at start :5 +Value of @b at end :6 + +----------- +6 + +*/ diff --git a/1-59059-720-6/Chapter10/1.FirstStoredProcedureCreation.sql b/1-59059-720-6/Chapter10/1.FirstStoredProcedureCreation.sql new file mode 100644 index 0000000..a95866d --- /dev/null +++ b/1-59059-720-6/Chapter10/1.FirstStoredProcedureCreation.sql @@ -0,0 +1,23 @@ +CREATE PROCEDURE CustomerDetails.apf_InsertCustomer + -- Add the parameters for the function here + @FirstName varchar(50) , + @LastName varchar(50), + @CustTitle int, + @CustInitials nvarchar(10), + @AddressId int, + @AccountNumber nvarchar(15), + @AccountTypeId int +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + SET NOCOUNT ON; + + INSERT INTO CustomerDetails.Customers + (CustomerTitleId,CustomerFirstName,CustomerOtherInitials,CustomerLastName, + AddressId,AccountNumber,AccountTypeId,ClearedBalance,UnclearedBalance) + VALUES (@CustTitle,@FirstName,@CustInitials,@LastName, + @AddressId,@AccountNumber,@AccountTypeId,0,0) + +END +GO diff --git a/1-59059-720-6/Chapter10/2.RunningFirstProcedure.sql b/1-59059-720-6/Chapter10/2.RunningFirstProcedure.sql new file mode 100644 index 0000000..aeb0d85 --- /dev/null +++ b/1-59059-720-6/Chapter10/2.RunningFirstProcedure.sql @@ -0,0 +1 @@ +CustomerDetails.apf_InsertCustomer 'Henry','Williams',1,NULL,431,'22067531',1 \ No newline at end of file diff --git a/1-59059-720-6/Chapter10/3.RunningSecondProcedure.sql b/1-59059-720-6/Chapter10/3.RunningSecondProcedure.sql new file mode 100644 index 0000000..053c537 --- /dev/null +++ b/1-59059-720-6/Chapter10/3.RunningSecondProcedure.sql @@ -0,0 +1,3 @@ +CustomerDetails.apf_InsertCustomer @CustTitle=1,@FirstName='Julie', +@CustInitials='A',@LastName='Dewson',@AddressId=6643, +@AccountNumber='SS865',@AccountTypeId=6 diff --git a/1-59059-720-6/Chapter10/4.SecondProcedureWithOUTPUT.sql b/1-59059-720-6/Chapter10/4.SecondProcedureWithOUTPUT.sql new file mode 100644 index 0000000..582e5cd --- /dev/null +++ b/1-59059-720-6/Chapter10/4.SecondProcedureWithOUTPUT.sql @@ -0,0 +1,37 @@ +-- =============================================== +-- Create stored procedure with OUTPUT parameters +-- =============================================== +-- Drop stored procedure if it already exists +IF EXISTS ( + SELECT * + FROM INFORMATION_SCHEMA.ROUTINES + WHERE SPECIFIC_SCHEMA = N'CustomerDetails' + AND SPECIFIC_NAME = N'apf_CustBalances' +) + DROP PROCEDURE CustomerDetails.apf_CustBalances +GO + +CREATE PROCEDURE CustomerDetails.apf_CustBalances + @CustId int, + @ClearedBalance money OUTPUT, + @UnclearedBalance money OUTPUT +AS +SELECT @ClearedBalance = ClearedBalance, @UnclearedBalance = UnclearedBalance + FROM Customers + WHERE CustomerId = @CustId + RETURN @@Error +GO + +-- ============================================= +-- Example to execute the stored procedure +-- ============================================= +DECLARE @ClearedBalance Money, @UnclearedBalance Money +DECLARE @RetVal int + +EXECUTE @RetVal=CustomerDetails.apf_CustBalances 1, @ClearedBalance OUTPUT, +@UnclearedBalance OUTPUT + +SELECT @RetVal AS ReturnValue, @ClearedBalance AS ClearedBalance, +@UnclearedBalance AS UnclearedBalance +GO + diff --git a/1-59059-720-6/Chapter10/5.BREAK.sql b/1-59059-720-6/Chapter10/5.BREAK.sql new file mode 100644 index 0000000..df4d2dc --- /dev/null +++ b/1-59059-720-6/Chapter10/5.BREAK.sql @@ -0,0 +1,14 @@ +DECLARE @LoopCount int, @TestCount int +SET @LoopCount = 0 +SET @TestCount = 0 +WHILE @LoopCount < 20 +BEGIN + SET @LoopCount = @LoopCount + 1 + SET @TestCount = @TestCount + 1 + SELECT @LoopCount, @TestCount + IF @TestCount > 10 + BREAK + ELSE + CONTINUE + SELECT @LoopCount, @TestCount +END diff --git a/1-59059-720-6/Chapter10/6.CASE-2-Example.sql b/1-59059-720-6/Chapter10/6.CASE-2-Example.sql new file mode 100644 index 0000000..c940aee --- /dev/null +++ b/1-59059-720-6/Chapter10/6.CASE-2-Example.sql @@ -0,0 +1,7 @@ +SELECT CustomerId, +CASE +WHEN ClearedBalance < 0 THEN 'OverDrawn' +WHEN ClearedBalance > 0 THEN ' In Credit' +ELSE 'Flat' +END, ClearedBalance +FROM CustomerDetails.Customers diff --git a/1-59059-720-6/Chapter10/6.CASEExample.sql b/1-59059-720-6/Chapter10/6.CASEExample.sql new file mode 100644 index 0000000..d7d5499 --- /dev/null +++ b/1-59059-720-6/Chapter10/6.CASEExample.sql @@ -0,0 +1,15 @@ +INSERT INTO TransactionDetails.TransactionTypes +(TransactionDescription,CreditType,AffectCashBalance) +VALUES ('Deposit',1,1) +INSERT INTO TransactionDetails.TransactionTypes +(TransactionDescription,CreditType,AffectCashBalance) +VALUES ('Withdrawal',0,1) +INSERT INTO TransactionDetails.TransactionTypes +(TransactionDescription,CreditType,AffectCashBalance) +VALUES ('BoughtShares',1,0) +SELECT TransactionDescription, +CASE CreditType +WHEN 0 THEN 'Debiting the account' +WHEN 1 THEN 'Crediting the account' +END +FROM TransactionDetails.TransactionTypes diff --git a/1-59059-720-6/Chapter10/7.FinalExampleAllTogether.sql b/1-59059-720-6/Chapter10/7.FinalExampleAllTogether.sql new file mode 100644 index 0000000..456cf7a --- /dev/null +++ b/1-59059-720-6/Chapter10/7.FinalExampleAllTogether.sql @@ -0,0 +1,44 @@ +CREATE PROCEDURE CustomerDetails.apf_CustMovement @CustId bigint, +@FromDate datetime, @ToDate datetime +AS +BEGIN +DECLARE @RunningBal money, @StillCalc Bit, @LastTran bigint + +SELECT @StillCalc = 1, @LastTran = 0, @RunningBal = 0 +WHILE @StillCalc = 1 +BEGIN + SELECT TOP 1 @RunningBal = @RunningBal + CASE + WHEN tt.CreditType = 1 THEN t.Amount + ELSE t.Amount * -1 END, + @LastTran = t.TransactionId + FROM CustomerDetails.Customers c + JOIN TransactionDetails.Transactions t ON t.CustomerId = c.CustomerId + JOIN TransactionDetails.TransactionTypes tt ON tt.TransactionTypeId = t.TransactionType + WHERE t.TransactionId > @LastTran + AND tt.AffectCashBalance = 1 + AND DateEntered BETWEEN @FromDate AND @ToDate + ORDER BY DateEntered + IF @@ROWCOUNT > 0 + -- Perform some interest calculation here… + CONTINUE + ELSE + BREAK +END + +SELECT @RunningBal AS 'End Balance' +END +GO +INSERT INTO TransactionDetails.Transactions +(CustomerId,TransactionType,DateEntered,Amount,RelatedProductId) +VALUES (1,1,'1 Aug 2005',100.00,1) +INSERT INTO TransactionDetails.Transactions +(CustomerId,TransactionType,DateEntered,Amount,RelatedProductId) +VALUES (1,1,'3 Aug 2005',75.67,1) +INSERT INTO TransactionDetails.Transactions +(CustomerId,TransactionType,DateEntered,Amount,RelatedProductId) +VALUES (1,2,'5 Aug 2005',35.20,1) +INSERT INTO TransactionDetails.Transactions +(CustomerId,TransactionType,DateEntered,Amount,RelatedProductId) +VALUES (1,2,'6 Aug 2005',20.00,1) +EXEC CustomerDetails.apf_CustMovement 1,'1 Aug 2005','31 Aug 2005' + diff --git a/1-59059-720-6/Chapter10/readme.txt b/1-59059-720-6/Chapter10/readme.txt new file mode 100644 index 0000000..9f3d4fa --- /dev/null +++ b/1-59059-720-6/Chapter10/readme.txt @@ -0,0 +1,4 @@ +Here we are dealing with stored procedures + +Robin Dewson +www.fat-belly.com \ No newline at end of file diff --git a/1-59059-720-6/Chapter11/1-JOIN.sql b/1-59059-720-6/Chapter11/1-JOIN.sql new file mode 100644 index 0000000..e0dd629 --- /dev/null +++ b/1-59059-720-6/Chapter11/1-JOIN.sql @@ -0,0 +1,3 @@ +SELECT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.Shares s + JOIN ShareDetails.SharePrices sp ON sp.ShareId = s.ShareId diff --git a/1-59059-720-6/Chapter11/10-Variables-2batches.sql b/1-59059-720-6/Chapter11/10-Variables-2batches.sql new file mode 100644 index 0000000..59c5447 --- /dev/null +++ b/1-59059-720-6/Chapter11/10-Variables-2batches.sql @@ -0,0 +1,7 @@ +DECLARE @MyDate datetime, @CurrPriceInCents money +SET @MyDate = GETDATE() +SELECT @CurrPriceInCents = CurrentPrice * 100 + FROM ShareDetails.Shares + WHERE ShareId = 2 +GO +SELECT @MyDate,@CurrPriceInCents diff --git a/1-59059-720-6/Chapter11/11-Variables-MultipleRows.sql b/1-59059-720-6/Chapter11/11-Variables-MultipleRows.sql new file mode 100644 index 0000000..82bbe2a --- /dev/null +++ b/1-59059-720-6/Chapter11/11-Variables-MultipleRows.sql @@ -0,0 +1,7 @@ +DECLARE @MyDate datetime, @CurrPriceInCents money +SET @MyDate = GETDATE() +SELECT @CurrPriceInCents = CurrentPrice * 100 + FROM ShareDetails.Shares +-- WHERE ShareId = 2 +--GO +SELECT @MyDate,@CurrPriceInCents diff --git a/1-59059-720-6/Chapter11/12-TempTable.sql b/1-59059-720-6/Chapter11/12-TempTable.sql new file mode 100644 index 0000000..c78de8e --- /dev/null +++ b/1-59059-720-6/Chapter11/12-TempTable.sql @@ -0,0 +1,9 @@ +CREATE TABLE #SharesTmp +(ShareDesc varchar(50), +Price numeric(18,5), +PriceDate datetime) +INSERT INTO #SharesTmp +SELECT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.Shares s + JOIN ShareDetails.SharePrices sp ON sp.ShareId = s.ShareId +SELECT * FROM #SharesTmp \ No newline at end of file diff --git a/1-59059-720-6/Chapter11/13-GlobalTempTable.sql b/1-59059-720-6/Chapter11/13-GlobalTempTable.sql new file mode 100644 index 0000000..ff848da --- /dev/null +++ b/1-59059-720-6/Chapter11/13-GlobalTempTable.sql @@ -0,0 +1,9 @@ +CREATE TABLE ##SharesTmp +(ShareDesc varchar(50), +Price numeric(18,5), +PriceDate datetime) +INSERT INTO ##SharesTmp +SELECT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.Shares s + JOIN ShareDetails.SharePrices sp ON sp.ShareId = s.ShareId +SELECT * FROM ##SharesTmp diff --git a/1-59059-720-6/Chapter11/13.Count.sql b/1-59059-720-6/Chapter11/13.Count.sql new file mode 100644 index 0000000..3f51825 --- /dev/null +++ b/1-59059-720-6/Chapter11/13.Count.sql @@ -0,0 +1,2 @@ +SELECT COUNT(*) AS 'Number of Rows' +FROM ShareDetails.Shares diff --git a/1-59059-720-6/Chapter11/14.CountFilter.sql b/1-59059-720-6/Chapter11/14.CountFilter.sql new file mode 100644 index 0000000..a5c4f1e --- /dev/null +++ b/1-59059-720-6/Chapter11/14.CountFilter.sql @@ -0,0 +1,3 @@ +SELECT COUNT(*) AS 'Number of Rows' +FROM ShareDetails.Shares +WHERE CurrentPrice > 10 diff --git a/1-59059-720-6/Chapter11/15-Sum.sql b/1-59059-720-6/Chapter11/15-Sum.sql new file mode 100644 index 0000000..1e59e6c --- /dev/null +++ b/1-59059-720-6/Chapter11/15-Sum.sql @@ -0,0 +1,4 @@ +SELECT SUM(Amount) AS 'Amount Deposited' + FROM TransactionDetails.Transactions + WHERE CustomerId = 1 + AND TransactionType = 1 diff --git a/1-59059-720-6/Chapter11/16-MaxMin.sql b/1-59059-720-6/Chapter11/16-MaxMin.sql new file mode 100644 index 0000000..cb25132 --- /dev/null +++ b/1-59059-720-6/Chapter11/16-MaxMin.sql @@ -0,0 +1,3 @@ +SELECT MAX(Price) MaxPrice,MIN(Price) MinPrice +FROM ShareDetails.SharePrices +WHERE ShareId = 1 diff --git a/1-59059-720-6/Chapter11/17-AVG.sql b/1-59059-720-6/Chapter11/17-AVG.sql new file mode 100644 index 0000000..f7a53f1 --- /dev/null +++ b/1-59059-720-6/Chapter11/17-AVG.sql @@ -0,0 +1,3 @@ +SELECT AVG(Price) AvgPrice +FROM ShareDetails.SharePrices +WHERE ShareId = 1 diff --git a/1-59059-720-6/Chapter11/18-GROUPBY.sql b/1-59059-720-6/Chapter11/18-GROUPBY.sql new file mode 100644 index 0000000..b81db28 --- /dev/null +++ b/1-59059-720-6/Chapter11/18-GROUPBY.sql @@ -0,0 +1,4 @@ + SELECT ShareId, MIN(Price) MinPrice, Max(Price) MaxPrice + FROM ShareDetails.SharePrices + WHERE ShareId < 9999 + GROUP BY ShareId diff --git a/1-59059-720-6/Chapter11/19-GROUPBY-2.sql b/1-59059-720-6/Chapter11/19-GROUPBY-2.sql new file mode 100644 index 0000000..b4c3d6b --- /dev/null +++ b/1-59059-720-6/Chapter11/19-GROUPBY-2.sql @@ -0,0 +1,5 @@ +SELECT sp.ShareId, s.ShareDesc,MIN(Price) MinPrice, Max(Price) MaxPrice + FROM ShareDetails.SharePrices sp + LEFT JOIN ShareDetails.Shares s ON s.ShareId = sp.ShareId + WHERE sp.ShareId < 9999 + GROUP BY ALL sp.ShareId, s.ShareDesc diff --git a/1-59059-720-6/Chapter11/2-JOINonTwoColumns.sql b/1-59059-720-6/Chapter11/2-JOINonTwoColumns.sql new file mode 100644 index 0000000..393a414 --- /dev/null +++ b/1-59059-720-6/Chapter11/2-JOINonTwoColumns.sql @@ -0,0 +1,4 @@ +SELECT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.Shares s + JOIN ShareDetails.SharePrices sp ON sp.ShareId = s.ShareId + AND sp.Price = s.CurrentPrice diff --git a/1-59059-720-6/Chapter11/20-HAVING.sql b/1-59059-720-6/Chapter11/20-HAVING.sql new file mode 100644 index 0000000..9f9c0a5 --- /dev/null +++ b/1-59059-720-6/Chapter11/20-HAVING.sql @@ -0,0 +1,6 @@ +SELECT sp.ShareId, s.ShareDesc,MIN(Price) MinPrice, Max(Price) MaxPrice + FROM ShareDetails.SharePrices sp + LEFT JOIN ShareDetails.Shares s ON s.ShareId = sp.ShareId + WHERE sp.ShareId < 9999 + GROUP BY ALL sp.ShareId, s.ShareDesc +HAVING MIN(Price) > 10 diff --git a/1-59059-720-6/Chapter11/21-PREDISTINCT.sql b/1-59059-720-6/Chapter11/21-PREDISTINCT.sql new file mode 100644 index 0000000..e0dd629 --- /dev/null +++ b/1-59059-720-6/Chapter11/21-PREDISTINCT.sql @@ -0,0 +1,3 @@ +SELECT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.Shares s + JOIN ShareDetails.SharePrices sp ON sp.ShareId = s.ShareId diff --git a/1-59059-720-6/Chapter11/22-DISTINCT-1.sql b/1-59059-720-6/Chapter11/22-DISTINCT-1.sql new file mode 100644 index 0000000..f2a230b --- /dev/null +++ b/1-59059-720-6/Chapter11/22-DISTINCT-1.sql @@ -0,0 +1,3 @@ +SELECT DISTINCT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.Shares s + JOIN ShareDetails.SharePrices sp ON sp.ShareId = s.ShareId diff --git a/1-59059-720-6/Chapter11/23-DISTINCT-2.sql b/1-59059-720-6/Chapter11/23-DISTINCT-2.sql new file mode 100644 index 0000000..c51eb0a --- /dev/null +++ b/1-59059-720-6/Chapter11/23-DISTINCT-2.sql @@ -0,0 +1,3 @@ +SELECT DISTINCT s.ShareDesc + FROM ShareDetails.Shares s + JOIN ShareDetails.SharePrices sp ON sp.ShareId = s.ShareId diff --git a/1-59059-720-6/Chapter11/24-DATEADD.sql b/1-59059-720-6/Chapter11/24-DATEADD.sql new file mode 100644 index 0000000..73b2a9b --- /dev/null +++ b/1-59059-720-6/Chapter11/24-DATEADD.sql @@ -0,0 +1,3 @@ +DECLARE @OldTime datetime +SET @OldTime = '24 March 2006 3:00 PM' +SELECT DATEADD(hh,4,@OldTime) diff --git a/1-59059-720-6/Chapter11/25-DATEADD-SUBTRACTION.sql b/1-59059-720-6/Chapter11/25-DATEADD-SUBTRACTION.sql new file mode 100644 index 0000000..1669a0a --- /dev/null +++ b/1-59059-720-6/Chapter11/25-DATEADD-SUBTRACTION.sql @@ -0,0 +1,3 @@ +DECLARE @OldTime datetime +SET @OldTime = '24 March 2006 3:00 PM' +SELECT DATEADD(hh,-6,@OldTime) diff --git a/1-59059-720-6/Chapter11/26-DATEDIFF.sql b/1-59059-720-6/Chapter11/26-DATEDIFF.sql new file mode 100644 index 0000000..df3fe0f --- /dev/null +++ b/1-59059-720-6/Chapter11/26-DATEDIFF.sql @@ -0,0 +1,4 @@ +DECLARE @FirstTime datetime, @SecondTime datetime +SET @FirstTime = '24 March 2006 3:00 PM' +SET @SecondTime = '24 March 2006 3:33PM' +SELECT DATEDIFF(ms,@FirstTime,@SecondTime) diff --git a/1-59059-720-6/Chapter11/27-DATENAME.sql b/1-59059-720-6/Chapter11/27-DATENAME.sql new file mode 100644 index 0000000..5c4c0b6 --- /dev/null +++ b/1-59059-720-6/Chapter11/27-DATENAME.sql @@ -0,0 +1,3 @@ +DECLARE @StatementDate datetime +SET @StatementDate = '24 March 2006 3:00 PM' +SELECT DATENAME(dw,@StatementDate) diff --git a/1-59059-720-6/Chapter11/28-DATEPART.sql b/1-59059-720-6/Chapter11/28-DATEPART.sql new file mode 100644 index 0000000..7e90d7e --- /dev/null +++ b/1-59059-720-6/Chapter11/28-DATEPART.sql @@ -0,0 +1,3 @@ +DECLARE @WhatsTheDay datetime +SET @WhatsTheDay = '24 March 2006 3:00 PM' +SELECT DATEPART(dd, @WhatsTheDay) diff --git a/1-59059-720-6/Chapter11/29-DATEFormatted.sql b/1-59059-720-6/Chapter11/29-DATEFormatted.sql new file mode 100644 index 0000000..f414c73 --- /dev/null +++ b/1-59059-720-6/Chapter11/29-DATEFormatted.sql @@ -0,0 +1,7 @@ +DECLARE @WhatsTheDay datetime +SET @WhatsTheDay = '24 March 2006 3:00 PM' +SELECT +DATENAME(dw,DATEPART(dd, @WhatsTheDay)) + ', ' + +CAST(DATEPART(dd,@WhatsTheDay) AS varchar(2)) + ' ' + +DATENAME(mm,@WhatsTheDay) + ' ' + +CAST(DATEPART(yyyy,@WhatsTheDay) AS char(4)) diff --git a/1-59059-720-6/Chapter11/3.LEFT-OUTERJOIN.sql b/1-59059-720-6/Chapter11/3.LEFT-OUTERJOIN.sql new file mode 100644 index 0000000..e89b928 --- /dev/null +++ b/1-59059-720-6/Chapter11/3.LEFT-OUTERJOIN.sql @@ -0,0 +1,3 @@ +SELECT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.Shares s + LEFT OUTER JOIN ShareDetails.SharePrices sp ON sp.ShareId = s.ShareId diff --git a/1-59059-720-6/Chapter11/30-ASCII.sql b/1-59059-720-6/Chapter11/30-ASCII.sql new file mode 100644 index 0000000..9929c68 --- /dev/null +++ b/1-59059-720-6/Chapter11/30-ASCII.sql @@ -0,0 +1,3 @@ +DECLARE @StringTest char(10) +SET @StringTest = ASCII('Robin ') +SELECT @StringTest diff --git a/1-59059-720-6/Chapter11/31-CHAR.sql b/1-59059-720-6/Chapter11/31-CHAR.sql new file mode 100644 index 0000000..24a59ed --- /dev/null +++ b/1-59059-720-6/Chapter11/31-CHAR.sql @@ -0,0 +1,3 @@ +DECLARE @StringTest char(10) +SET @StringTest = ASCII('Robin ') +SELECT CHAR(@StringTest) diff --git a/1-59059-720-6/Chapter11/32-CHAR-2.sql b/1-59059-720-6/Chapter11/32-CHAR-2.sql new file mode 100644 index 0000000..e160de9 --- /dev/null +++ b/1-59059-720-6/Chapter11/32-CHAR-2.sql @@ -0,0 +1,3 @@ +DECLARE @StringTest int +SET @StringTest = ASCII('Robin ') +SELECT CHAR(@StringTest) diff --git a/1-59059-720-6/Chapter11/33-LEFT.sql b/1-59059-720-6/Chapter11/33-LEFT.sql new file mode 100644 index 0000000..608c8bc --- /dev/null +++ b/1-59059-720-6/Chapter11/33-LEFT.sql @@ -0,0 +1,3 @@ +DECLARE @StringTest char(10) +SET @StringTest = 'Robin ' +SELECT LEFT(@StringTest,3) diff --git a/1-59059-720-6/Chapter11/34-Lower.sql b/1-59059-720-6/Chapter11/34-Lower.sql new file mode 100644 index 0000000..39fcd2a --- /dev/null +++ b/1-59059-720-6/Chapter11/34-Lower.sql @@ -0,0 +1,3 @@ +DECLARE @StringTest char(10) +SET @StringTest = 'Robin ' +SELECT LOWER(LEFT(@StringTest,3)) diff --git a/1-59059-720-6/Chapter11/35-LTRIM.sql b/1-59059-720-6/Chapter11/35-LTRIM.sql new file mode 100644 index 0000000..3c6ef67 --- /dev/null +++ b/1-59059-720-6/Chapter11/35-LTRIM.sql @@ -0,0 +1,3 @@ +DECLARE @StringTest char(10) +SET @StringTest = ' Robin' +SELECT 'Start-'+LTRIM(@StringTest),'Start-'+@StringTest diff --git a/1-59059-720-6/Chapter11/36-RIGHT.sql b/1-59059-720-6/Chapter11/36-RIGHT.sql new file mode 100644 index 0000000..c2d5431 --- /dev/null +++ b/1-59059-720-6/Chapter11/36-RIGHT.sql @@ -0,0 +1,3 @@ +DECLARE @StringTest char(10) +SET @StringTest = ' Robin' +SELECT RIGHT(@StringTest,3) diff --git a/1-59059-720-6/Chapter11/37-RTRIM.sql b/1-59059-720-6/Chapter11/37-RTRIM.sql new file mode 100644 index 0000000..8934610 --- /dev/null +++ b/1-59059-720-6/Chapter11/37-RTRIM.sql @@ -0,0 +1,3 @@ +DECLARE @StringTest char(10) +SET @StringTest = 'Robin' +SELECT @StringTest+'-End',RTRIM(@StringTest)+'-End' diff --git a/1-59059-720-6/Chapter11/38-STR.sql b/1-59059-720-6/Chapter11/38-STR.sql new file mode 100644 index 0000000..268c18d --- /dev/null +++ b/1-59059-720-6/Chapter11/38-STR.sql @@ -0,0 +1 @@ +SELECT 'A'+STR(82) \ No newline at end of file diff --git a/1-59059-720-6/Chapter11/39-LTRIM-AND-STR.sql b/1-59059-720-6/Chapter11/39-LTRIM-AND-STR.sql new file mode 100644 index 0000000..90e67b9 --- /dev/null +++ b/1-59059-720-6/Chapter11/39-LTRIM-AND-STR.sql @@ -0,0 +1 @@ +SELECT 'A'+LTRIM(STR(82)) \ No newline at end of file diff --git a/1-59059-720-6/Chapter11/4.LEFT-OUTERJOIN-WithNoPrice.sql b/1-59059-720-6/Chapter11/4.LEFT-OUTERJOIN-WithNoPrice.sql new file mode 100644 index 0000000..174293e --- /dev/null +++ b/1-59059-720-6/Chapter11/4.LEFT-OUTERJOIN-WithNoPrice.sql @@ -0,0 +1,4 @@ +SELECT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.Shares s + LEFT OUTER JOIN ShareDetails.SharePrices sp ON sp.ShareId = s.ShareId +WHERE sp.Price IS NULL diff --git a/1-59059-720-6/Chapter11/40-SUBSTRING.sql b/1-59059-720-6/Chapter11/40-SUBSTRING.sql new file mode 100644 index 0000000..18bb897 --- /dev/null +++ b/1-59059-720-6/Chapter11/40-SUBSTRING.sql @@ -0,0 +1,3 @@ +DECLARE @StringTest char(10) +SET @StringTest = 'Robin ' +SELECT SUBSTRING(@StringTest,3,LEN(@StringTest)) diff --git a/1-59059-720-6/Chapter11/41-UPPER.sql b/1-59059-720-6/Chapter11/41-UPPER.sql new file mode 100644 index 0000000..ef67479 --- /dev/null +++ b/1-59059-720-6/Chapter11/41-UPPER.sql @@ -0,0 +1,3 @@ +DECLARE @StringTest char(10) +SET @StringTest = 'Robin ' +SELECT UPPER(@StringTest) diff --git a/1-59059-720-6/Chapter11/42-CASE.sql b/1-59059-720-6/Chapter11/42-CASE.sql new file mode 100644 index 0000000..bd53c19 --- /dev/null +++ b/1-59059-720-6/Chapter11/42-CASE.sql @@ -0,0 +1,6 @@ +SET QUOTED_IDENTIFIER OFF +SELECT CustomerId,CASE WHEN CreditType = 0 THEN "Debits" ELSE "Credits" END AS TranType,SUM(Amount) + FROM TransactionDetails.Transactions t + JOIN TransactionDetails.TransactionTypes tt ON tt.TransActionTypeId = t.TransactionType + WHERE t.DateEntered BETWEEN '1 Aug 2005' AND '31 Aug 2005' + GROUP BY CustomerId,CreditType diff --git a/1-59059-720-6/Chapter11/43-CAST.sql b/1-59059-720-6/Chapter11/43-CAST.sql new file mode 100644 index 0000000..a8cc23c --- /dev/null +++ b/1-59059-720-6/Chapter11/43-CAST.sql @@ -0,0 +1,3 @@ +DECLARE @Cast int +SET @Cast = 1234 +SELECT CAST(@Cast as char(10)) + '-End' diff --git a/1-59059-720-6/Chapter11/44-CONVERT.sql b/1-59059-720-6/Chapter11/44-CONVERT.sql new file mode 100644 index 0000000..1810ccf --- /dev/null +++ b/1-59059-720-6/Chapter11/44-CONVERT.sql @@ -0,0 +1,3 @@ +DECLARE @Convert int +SET @Convert = 5678 +SELECT CONVERT(char(10),@Convert) + '-End' diff --git a/1-59059-720-6/Chapter11/45-ISDATE.sql b/1-59059-720-6/Chapter11/45-ISDATE.sql new file mode 100644 index 0000000..469dff8 --- /dev/null +++ b/1-59059-720-6/Chapter11/45-ISDATE.sql @@ -0,0 +1,3 @@ +DECLARE @IsDate char(15) +SET @IsDate = '31 Sep 2005' +SELECT ISDATE(@IsDate) diff --git a/1-59059-720-6/Chapter11/46-ISDATe-VALID.sql b/1-59059-720-6/Chapter11/46-ISDATe-VALID.sql new file mode 100644 index 0000000..fcac6cb --- /dev/null +++ b/1-59059-720-6/Chapter11/46-ISDATe-VALID.sql @@ -0,0 +1,3 @@ +DECLARE @IsDate char(15) +SET @IsDate = '30 Sep 2005' +SELECT ISDATE(@IsDate) diff --git a/1-59059-720-6/Chapter11/47-ISNULL.sql b/1-59059-720-6/Chapter11/47-ISNULL.sql new file mode 100644 index 0000000..e8fafd5 --- /dev/null +++ b/1-59059-720-6/Chapter11/47-ISNULL.sql @@ -0,0 +1,3 @@ +DECLARE @IsNull char(10) +SET @IsNull = NULL +SELECT ISNULL(@IsNull,GETDATE()) diff --git a/1-59059-720-6/Chapter11/48-ISNUMERIC-FALSE.sql b/1-59059-720-6/Chapter11/48-ISNUMERIC-FALSE.sql new file mode 100644 index 0000000..8a9f94c --- /dev/null +++ b/1-59059-720-6/Chapter11/48-ISNUMERIC-FALSE.sql @@ -0,0 +1,3 @@ +DECLARE @IsNum char(10) +SET @IsNum = 'Robin ' +SELECT ISNUMERIC(@IsNum) diff --git a/1-59059-720-6/Chapter11/49-ISNUMERIC-TRUE.sql b/1-59059-720-6/Chapter11/49-ISNUMERIC-TRUE.sql new file mode 100644 index 0000000..6480004 --- /dev/null +++ b/1-59059-720-6/Chapter11/49-ISNUMERIC-TRUE.sql @@ -0,0 +1,3 @@ +DECLARE @IsNum char(10) +SET @IsNum = '1234 ' +SELECT ISNUMERIC(@IsNum) diff --git a/1-59059-720-6/Chapter11/5.RIGHT-OUTERJOIN.sql b/1-59059-720-6/Chapter11/5.RIGHT-OUTERJOIN.sql new file mode 100644 index 0000000..cd10bf8 --- /dev/null +++ b/1-59059-720-6/Chapter11/5.RIGHT-OUTERJOIN.sql @@ -0,0 +1,3 @@ +SELECT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.SharePrices sp + RIGHT OUTER JOIN ShareDetails.Shares s ON sp.ShareId = s.ShareId diff --git a/1-59059-720-6/Chapter11/50-spaddmessage.sql b/1-59059-720-6/Chapter11/50-spaddmessage.sql new file mode 100644 index 0000000..43bf86b --- /dev/null +++ b/1-59059-720-6/Chapter11/50-spaddmessage.sql @@ -0,0 +1,2 @@ +sp_addmessage @msgnum=50001,@severity=1, +@msgtext='Customer is overdrawn' diff --git a/1-59059-720-6/Chapter11/51-CustomerOverdrawn.sql b/1-59059-720-6/Chapter11/51-CustomerOverdrawn.sql new file mode 100644 index 0000000..e31120a --- /dev/null +++ b/1-59059-720-6/Chapter11/51-CustomerOverdrawn.sql @@ -0,0 +1 @@ +RAISERROR (50001,1,1) \ No newline at end of file diff --git a/1-59059-720-6/Chapter11/52-sp_addmessage_chage.sql b/1-59059-720-6/Chapter11/52-sp_addmessage_chage.sql new file mode 100644 index 0000000..5f5953c --- /dev/null +++ b/1-59059-720-6/Chapter11/52-sp_addmessage_chage.sql @@ -0,0 +1,2 @@ +sp_addmessage @msgnum =50001,@severity=1, +@msgtext='Customer is overdrawn. CustomerId= %010u',@replace='replace' diff --git a/1-59059-720-6/Chapter11/53-RAISEERROR-improved.sql b/1-59059-720-6/Chapter11/53-RAISEERROR-improved.sql new file mode 100644 index 0000000..8b1c36a --- /dev/null +++ b/1-59059-720-6/Chapter11/53-RAISEERROR-improved.sql @@ -0,0 +1 @@ +RAISERROR (50001,1,1,243) \ No newline at end of file diff --git a/1-59059-720-6/Chapter11/54-DOUBLE-@@ERROR.sql b/1-59059-720-6/Chapter11/54-DOUBLE-@@ERROR.sql new file mode 100644 index 0000000..d285d8c --- /dev/null +++ b/1-59059-720-6/Chapter11/54-DOUBLE-@@ERROR.sql @@ -0,0 +1,3 @@ +SELECT 100/0 +SELECT @@ERROR +SELECT @@ERROR diff --git a/1-59059-720-6/Chapter11/55-RAISERROR-With-@@ERROR.sql b/1-59059-720-6/Chapter11/55-RAISERROR-With-@@ERROR.sql new file mode 100644 index 0000000..f1261d0 --- /dev/null +++ b/1-59059-720-6/Chapter11/55-RAISERROR-With-@@ERROR.sql @@ -0,0 +1,2 @@ +RAISERROR (50001,1,1,243) +SELECT @@ERROR diff --git a/1-59059-720-6/Chapter11/56-RAISERROR-Severity11.sql b/1-59059-720-6/Chapter11/56-RAISERROR-Severity11.sql new file mode 100644 index 0000000..753ae0e --- /dev/null +++ b/1-59059-720-6/Chapter11/56-RAISERROR-Severity11.sql @@ -0,0 +1,2 @@ +RAISERROR (50001,11,1,243) +SELECT @@ERROR diff --git a/1-59059-720-6/Chapter11/57-TryCatch-1.sql b/1-59059-720-6/Chapter11/57-TryCatch-1.sql new file mode 100644 index 0000000..afdcd17 --- /dev/null +++ b/1-59059-720-6/Chapter11/57-TryCatch-1.sql @@ -0,0 +1,10 @@ +DECLARE @Probs int +BEGIN TRY + SELECT 'This will work' + SELECT @Probs='Not Right' + SELECT 10+5,'This will also work, however the error means it wont run' +END TRY +BEGIN CATCH + SELECT 'An error has occurred at line ' + LTRIM(STR(ERROR_LINE())) + + ' with error ' + LTRIM(STR(ERROR_NUMBER())) + ' ' + ERROR_MESSAGE() +END CATCH diff --git a/1-59059-720-6/Chapter11/58-TryCatch-2.sql b/1-59059-720-6/Chapter11/58-TryCatch-2.sql new file mode 100644 index 0000000..3f4298b --- /dev/null +++ b/1-59059-720-6/Chapter11/58-TryCatch-2.sql @@ -0,0 +1,16 @@ +DECLARE @Probs int +BEGIN TRY + SELECT 'This will work' + BEGIN TRY + SELECT @Probs='Not Right' + SELECT 10+5,'This will also work, however the error means it wont run' + END TRY + BEGIN CATCH + SELECT 'The second catch block' + END CATCH + SELECT 'And then this will now work' +END TRY +BEGIN CATCH + SELECT 'An error has occurred at line ' + LTRIM(STR(ERROR_LINE())) + + ' with error ' + LTRIM(STR(ERROR_NUMBER())) + ' ' + ERROR_MESSAGE() +END CATCH diff --git a/1-59059-720-6/Chapter11/59-TryCatch-3.sql b/1-59059-720-6/Chapter11/59-TryCatch-3.sql new file mode 100644 index 0000000..cc7166f --- /dev/null +++ b/1-59059-720-6/Chapter11/59-TryCatch-3.sql @@ -0,0 +1,15 @@ +DECLARE @Probs int +BEGIN TRY + SELECT 'This will work' + BEGIN TRY + SELECT * FROM #Temp + END TRY + BEGIN CATCH + SELECT 'The second catch block' + END CATCH + SELECT 'And then this will now work' +END TRY +BEGIN CATCH + SELECT 'An error has occurred at line ' + LTRIM(STR(ERROR_LINE())) + + ' with error ' + LTRIM(STR(ERROR_NUMBER())) + ' ' + ERROR_MESSAGE() +END CATCH diff --git a/1-59059-720-6/Chapter11/6-InsertForTest.sql b/1-59059-720-6/Chapter11/6-InsertForTest.sql new file mode 100644 index 0000000..933c40a --- /dev/null +++ b/1-59059-720-6/Chapter11/6-InsertForTest.sql @@ -0,0 +1,3 @@ +INSERT INTO ShareDetails.SharePrices +(ShareId, Price, PriceDate) +VALUES (99999,12.34,'1 Aug 2005 10:10AM') diff --git a/1-59059-720-6/Chapter11/60-TryCatch-LocalVariable.sql b/1-59059-720-6/Chapter11/60-TryCatch-LocalVariable.sql new file mode 100644 index 0000000..8969b46 --- /dev/null +++ b/1-59059-720-6/Chapter11/60-TryCatch-LocalVariable.sql @@ -0,0 +1,19 @@ +DECLARE @Probs int +SELECT 'This will work' +BEGIN TRY + SELECT @Probs='Not Right' + SELECT 10+5,'This will also work, however the error means it wont run' +END TRY +BEGIN CATCH + DECLARE @ErrMsg NVARCHAR(4000) + DECLARE @ErrSeverity INT + DECLARE @ErrState INT + SELECT 'Blimey! An error' + + SELECT + @ErrMsg = ERROR_MESSAGE(), + @ErrSeverity = ERROR_SEVERITY(), + @ErrState = ERROR_STATE(); + + RAISERROR (@ErrMsg,@ErrSeverity,@ErrState) +END CATCH diff --git a/1-59059-720-6/Chapter11/7-Full-OUTERJOIN.sql b/1-59059-720-6/Chapter11/7-Full-OUTERJOIN.sql new file mode 100644 index 0000000..5da19ed --- /dev/null +++ b/1-59059-720-6/Chapter11/7-Full-OUTERJOIN.sql @@ -0,0 +1,3 @@ +SELECT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.SharePrices sp + FULL OUTER JOIN ShareDetails.Shares s ON sp.ShareId = s.ShareId diff --git a/1-59059-720-6/Chapter11/8-CROSS-JOIN.sql b/1-59059-720-6/Chapter11/8-CROSS-JOIN.sql new file mode 100644 index 0000000..fe8bf2c --- /dev/null +++ b/1-59059-720-6/Chapter11/8-CROSS-JOIN.sql @@ -0,0 +1,3 @@ +SELECT s.ShareDesc,sp.Price,sp.PriceDate + FROM ShareDetails.SharePrices sp + CROSS JOIN ShareDetails.Shares s diff --git a/1-59059-720-6/Chapter11/9-Variables.sql b/1-59059-720-6/Chapter11/9-Variables.sql new file mode 100644 index 0000000..9700c81 --- /dev/null +++ b/1-59059-720-6/Chapter11/9-Variables.sql @@ -0,0 +1,6 @@ +DECLARE @MyDate datetime, @CurrPriceInCents money +SET @MyDate = GETDATE() +SELECT @CurrPriceInCents = CurrentPrice * 100 + FROM ShareDetails.Shares + WHERE ShareId = 2 +SELECT @MyDate,@CurrPriceInCents diff --git a/1-59059-720-6/Chapter11/readme.txt b/1-59059-720-6/Chapter11/readme.txt new file mode 100644 index 0000000..d844631 --- /dev/null +++ b/1-59059-720-6/Chapter11/readme.txt @@ -0,0 +1,4 @@ +This chapter deals with advancing your T-SQL knowledge + +Robin Dewson +www.fat-belly.com \ No newline at end of file diff --git a/1-59059-720-6/Chapter12/1-MaxSharePriceExample.sql b/1-59059-720-6/Chapter12/1-MaxSharePriceExample.sql new file mode 100644 index 0000000..cba65ef --- /dev/null +++ b/1-59059-720-6/Chapter12/1-MaxSharePriceExample.sql @@ -0,0 +1,13 @@ +ALTER TABLE ShareDetails.Shares +ADD MaximumSharePrice money + +DECLARE @MaxPrice money +SELECT @MaxPrice = MAX(Price) + FROM ShareDetails.SharePrices + WHERE ShareId = 1 +SELECT @MaxPrice + +UPDATE ShareDetails.Shares +SET MaximumSharePrice = @MaxPrice +WHERE ShareId = 1 + diff --git a/1-59059-720-6/Chapter12/10-CTE-NoCTE.sql b/1-59059-720-6/Chapter12/10-CTE-NoCTE.sql new file mode 100644 index 0000000..1700ba8 --- /dev/null +++ b/1-59059-720-6/Chapter12/10-CTE-NoCTE.sql @@ -0,0 +1,16 @@ +USE AdventureWorks +GO +SELECT p.ProductSubcategoryID, s.Name,SUM(ListPrice) AS ListPrice + INTO #Temp1 + FROM Production.Product p + JOIN Production.ProductSubcategory s ON s.ProductSubcategoryID = + p.ProductSubcategoryID + WHERE p.ProductSubcategoryID IS NOT NULL + GROUP BY p.ProductSubcategoryID, s.Name + +SELECT ProductSubcategoryID,Name,MAX(ListPrice) + FROM #Temp1 + GROUP BY ProductSubcategoryID, Name +HAVING MAX(ListPrice) = (SELECT MAX(ListPrice) FROM #Temp1) + +DROP TABLE #Temp1 diff --git a/1-59059-720-6/Chapter12/11-CTE-WithCTE.sql b/1-59059-720-6/Chapter12/11-CTE-WithCTE.sql new file mode 100644 index 0000000..f27430d --- /dev/null +++ b/1-59059-720-6/Chapter12/11-CTE-WithCTE.sql @@ -0,0 +1,13 @@ +WITH ProdList (ProductSubcategoryID,Name,ListPrice) AS +( +SELECT p.ProductSubcategoryID, s.Name,SUM(ListPrice) AS ListPrice + FROM Production.Product p + JOIN Production.ProductSubcategory s ON s.ProductSubcategoryID = + p.ProductSubcategoryID + WHERE p.ProductSubcategoryID IS NOT NULL + GROUP BY p.ProductSubcategoryID, s.Name +) +SELECT ProductSubcategoryID,Name,MAX(ListPrice) + FROM ProdList + GROUP BY ProductSubcategoryID, Name + HAVING MAX(ListPrice) = (SELECT MAX(ListPrice) FROM ProdList) diff --git a/1-59059-720-6/Chapter12/12-Recursive-CTE.sql b/1-59059-720-6/Chapter12/12-Recursive-CTE.sql new file mode 100644 index 0000000..24e229e --- /dev/null +++ b/1-59059-720-6/Chapter12/12-Recursive-CTE.sql @@ -0,0 +1,43 @@ +USE AdventureWorks; +GO +WITH EmployeeReportingStructure +(ManagerID, EmployeeID, EmployeeLevel, Level, +ManagerContactId,ManagerTitle,ManagerFirst,ManagerLast, +EmployeeTitle,EmployeeFirst,EmployeeLast) +AS +( +-- Anchor member definition + SELECT e.ManagerID, e.EmployeeID, e.Title as EmployeeLevel, + 0 AS Level, + e.ContactId as ManagerContactId, + CAST(' ' as nvarchar(8)) as ManagerTitle, + CAST(' ' as nvarchar(50)) as ManagerFirst, + CAST(' ' as nvarchar(50)) as ManagerLast, + c.Title as EmployeeTitle,c.FirstName as EmployeeFirst, + c.LastName as EmployeeLast + FROM HumanResources.Employee AS e + INNER JOIN Person.Contact c ON c.ContactId = e.ContactId + WHERE ManagerID IS NULL + UNION ALL +-- Recursive member definition + SELECT e.ManagerID, e.EmployeeID, e.Title as EmployeeLevel, Level + 1, + e.ContactId as ManagerContactId, + m.Title as ManagerTitle,m.FirstName as ManagerFirst, + m.LastName as ManagerLast, + c.Title as EmployeeTitle,c.FirstName as EmployeeFirst, + c.LastName as EmployeeLast + FROM HumanResources.Employee AS e + INNER JOIN Person.Contact c ON c.ContactId = e.ContactId + INNER JOIN EmployeeReportingStructure AS d + ON d.EmployeeID = e.ManagerID + INNER JOIN Person.Contact m ON m.ContactId = d.ManagerContactId +) +-- Statement that executes the CTE +SELECT ManagerID, EmployeeID, +ISNULL(ManagerTitle+' ','')+ManagerFirst+' '+ManagerLast as Manager, +EmployeeLevel, +ISNULL(EmployeeTitle+' ','')+EmployeeFirst+' '+EmployeeLast as Employee, +Level +FROM EmployeeReportingStructure +ORDER BY Level,EmployeeLast,EmployeeFirst +OPTION (MAXRECURSION 4) diff --git a/1-59059-720-6/Chapter12/13-Pre-PIVOT.sql b/1-59059-720-6/Chapter12/13-Pre-PIVOT.sql new file mode 100644 index 0000000..71ddbe3 --- /dev/null +++ b/1-59059-720-6/Chapter12/13-Pre-PIVOT.sql @@ -0,0 +1,7 @@ +USE AdventureWorks +GO +SELECT productID,UnitPriceDiscount,SUM(linetotal) + FROM Sales.SalesOrderDetail + WHERE productID IN (776,711,747) + GROUP BY productID,UnitPriceDiscount + ORDER BY productID,UnitPriceDiscount diff --git a/1-59059-720-6/Chapter12/14-PIVOT.sql b/1-59059-720-6/Chapter12/14-PIVOT.sql new file mode 100644 index 0000000..dff8093 --- /dev/null +++ b/1-59059-720-6/Chapter12/14-PIVOT.sql @@ -0,0 +1,11 @@ +SELECT pt.Discount,ISNULL([711],0.00) As Product711, + ISNULL([747],0.00) As Product747,ISNULL([776],0.00) As Product776 +FROM +(SELECT sod.LineTotal, sod.ProductID, sod.UnitPriceDiscount as Discount + FROM Sales.SalesOrderDetail sod) so +PIVOT +( +SUM(so.LineTotal) +FOR so.ProductID IN ([776], [711], [747]) +) AS pt +ORDER BY pt.Discount diff --git a/1-59059-720-6/Chapter12/15-UNPIVOT-Into-TEMP.sql b/1-59059-720-6/Chapter12/15-UNPIVOT-Into-TEMP.sql new file mode 100644 index 0000000..c0d5c95 --- /dev/null +++ b/1-59059-720-6/Chapter12/15-UNPIVOT-Into-TEMP.sql @@ -0,0 +1,14 @@ +USE AdventureWorks +go +SELECT pt.Discount,ISNULL([711],0.00) As Product711, + ISNULL([747],0.00) As Product747,ISNULL([776],0.00) As Product776 +INTO #Temp1 +FROM +(SELECT sod.LineTotal, sod.ProductID, sod.UnitPriceDiscount as Discount + FROM Sales.SalesOrderDetail sod) so +PIVOT +( +SUM(so.LineTotal) +FOR so.ProductID IN ([776], [711], [747]) +) AS pt +ORDER BY pt.Discount diff --git a/1-59059-720-6/Chapter12/16-ROW_NUMBER.sql b/1-59059-720-6/Chapter12/16-ROW_NUMBER.sql new file mode 100644 index 0000000..a553ac6 --- /dev/null +++ b/1-59059-720-6/Chapter12/16-ROW_NUMBER.sql @@ -0,0 +1,7 @@ +USE AdventureWorks +GO +SELECT ROW_NUMBER() OVER(ORDER BY LastName) AS RowNum, + FirstName + ' ' + LastName + FROM HumanResources.vEmployee + WHERE JobTitle = 'Production Technician - WC60' + ORDER BY LastName diff --git a/1-59059-720-6/Chapter12/17-RowNum-2.sql b/1-59059-720-6/Chapter12/17-RowNum-2.sql new file mode 100644 index 0000000..a783e4b --- /dev/null +++ b/1-59059-720-6/Chapter12/17-RowNum-2.sql @@ -0,0 +1,8 @@ +USE AdventureWorks +GO +SELECT ROW_NUMBER() + OVER(PARTITION BY SUBSTRING(LastName,1,1) + ORDER BY LastName) AS RowNum, FirstName + ' ' + LastName + FROM HumanResources.vEmployee + WHERE JobTitle = 'Production Technician - WC60' + ORDER BY LastName diff --git a/1-59059-720-6/Chapter12/18-Rank.sql b/1-59059-720-6/Chapter12/18-Rank.sql new file mode 100644 index 0000000..0de3887 --- /dev/null +++ b/1-59059-720-6/Chapter12/18-Rank.sql @@ -0,0 +1,7 @@ +USE AdventureWorks +GO +SELECT ROW_NUMBER() OVER(ORDER BY Department) AS RowNum, + RANK() OVER(ORDER BY Department) AS Ranking, + FirstName + ' ' + LastName AS Employee, Department + FROM HumanResources.vEmployeeDepartment + ORDER BY RowNum diff --git a/1-59059-720-6/Chapter12/19-DenseRank.sql b/1-59059-720-6/Chapter12/19-DenseRank.sql new file mode 100644 index 0000000..ad3b0a8 --- /dev/null +++ b/1-59059-720-6/Chapter12/19-DenseRank.sql @@ -0,0 +1,7 @@ +USE AdventureWorks +GO +SELECT ROW_NUMBER() OVER(ORDER BY Department) AS RowNum, + DENSE_RANK() OVER(ORDER BY Department) AS Ranking, + CONVERT(varchar(25),FirstName + ' ' + LastName), Department + FROM HumanResources.vEmployeeDepartment + ORDER BY RowNum diff --git a/1-59059-720-6/Chapter12/2-Correlated-Subquery.sql b/1-59059-720-6/Chapter12/2-Correlated-Subquery.sql new file mode 100644 index 0000000..a3668ab --- /dev/null +++ b/1-59059-720-6/Chapter12/2-Correlated-Subquery.sql @@ -0,0 +1,11 @@ +SELECT ShareId,MaximumSharePrice +FROM ShareDetails.Shares +UPDATE ShareDetails.Shares +SET MaximumSharePrice = (SELECT MAX(Price) + FROM ShareDetails.SharePrices sp + WHERE sp.ShareId = s.ShareId) +FROM ShareDetails.Shares s +SELECT ShareId,MaximumSharePrice +FROM ShareDetails.Shares + + diff --git a/1-59059-720-6/Chapter12/20-NTile.sql b/1-59059-720-6/Chapter12/20-NTile.sql new file mode 100644 index 0000000..e902762 --- /dev/null +++ b/1-59059-720-6/Chapter12/20-NTile.sql @@ -0,0 +1,5 @@ +USE AdventureWorks +GO +SELECT NTILE(10) OVER(ORDER BY Department) AS NTile, + FirstName + ' ' + LastName, Department + FROM HumanResources.vEmployeeDepartment diff --git a/1-59059-720-6/Chapter12/21-sp_tableoption.sql b/1-59059-720-6/Chapter12/21-sp_tableoption.sql new file mode 100644 index 0000000..4677c69 --- /dev/null +++ b/1-59059-720-6/Chapter12/21-sp_tableoption.sql @@ -0,0 +1,2 @@ +sp_tableoption 'TransactionDetails.Transactions', +'large value types out of row',1 diff --git a/1-59059-720-6/Chapter12/22-LOB-1.sql b/1-59059-720-6/Chapter12/22-LOB-1.sql new file mode 100644 index 0000000..d0fb49d --- /dev/null +++ b/1-59059-720-6/Chapter12/22-LOB-1.sql @@ -0,0 +1,3 @@ +UPDATE TransactionDetails.Transactions +SET Notes = 'From online auction sale of Redskins memorabilia, helmet' +WHERE TransactionId = 1 diff --git a/1-59059-720-6/Chapter12/23-LOB-Select.sql b/1-59059-720-6/Chapter12/23-LOB-Select.sql new file mode 100644 index 0000000..1695599 --- /dev/null +++ b/1-59059-720-6/Chapter12/23-LOB-Select.sql @@ -0,0 +1 @@ +SELECT * FROM TransactionDetails.Transactions \ No newline at end of file diff --git a/1-59059-720-6/Chapter12/24-LOB-Update-Dolphins.sql b/1-59059-720-6/Chapter12/24-LOB-Update-Dolphins.sql new file mode 100644 index 0000000..30b5f3d --- /dev/null +++ b/1-59059-720-6/Chapter12/24-LOB-Update-Dolphins.sql @@ -0,0 +1,3 @@ +UPDATE TransactionDetails.Transactions +SET Notes .WRITE('From online auction sale of Dolphins memorabilia, helmet',0,8000) +WHERE TransactionId = 1 diff --git a/1-59059-720-6/Chapter12/25-Update-Raiders.sql b/1-59059-720-6/Chapter12/25-Update-Raiders.sql new file mode 100644 index 0000000..735aed9 --- /dev/null +++ b/1-59059-720-6/Chapter12/25-Update-Raiders.sql @@ -0,0 +1,3 @@ +UPDATE TransactionDetails.Transactions +SET Notes .WRITE('Raiders',28,8) +WHERE TransactionId = 1 diff --git a/1-59059-720-6/Chapter12/26-Select-Raiders.sql b/1-59059-720-6/Chapter12/26-Select-Raiders.sql new file mode 100644 index 0000000..e2d0094 --- /dev/null +++ b/1-59059-720-6/Chapter12/26-Select-Raiders.sql @@ -0,0 +1 @@ +SELECT * FROM TransactionDetails.Transactions WHERE TransactionId = 1 \ No newline at end of file diff --git a/1-59059-720-6/Chapter12/27-Image-LOB.sql b/1-59059-720-6/Chapter12/27-Image-LOB.sql new file mode 100644 index 0000000..221d80e --- /dev/null +++ b/1-59059-720-6/Chapter12/27-Image-LOB.sql @@ -0,0 +1,5 @@ +INSERT INTO TransactionDetails.Transactions +(CustomerId, TransactionType, DateEntered,Amount,Notes, RelatedProductId) +SELECT 2, 1, GETDATE(),1000,PhotoToLoad.*, 1 +FROM OPENROWSET +(BULK 'c:\temp\photo.tif', SINGLE_BLOB) PhotoToLoad \ No newline at end of file diff --git a/1-59059-720-6/Chapter12/28-UpdateImage.sql b/1-59059-720-6/Chapter12/28-UpdateImage.sql new file mode 100644 index 0000000..bacb4b4 --- /dev/null +++ b/1-59059-720-6/Chapter12/28-UpdateImage.sql @@ -0,0 +1,6 @@ +UPDATE TransactionDetails.Transactions +SET Notes = ( +SELECT PhotoToLoad.* +FROM OPENROWSET +(BULK 'c:\Temp\photo2.jpg', SINGLE_BLOB) PhotoToLoad) +WHERE transactionId = 9 \ No newline at end of file diff --git a/1-59059-720-6/Chapter12/3-Backup-ReferenceONLY.sql b/1-59059-720-6/Chapter12/3-Backup-ReferenceONLY.sql new file mode 100644 index 0000000..98170ed --- /dev/null +++ b/1-59059-720-6/Chapter12/3-Backup-ReferenceONLY.sql @@ -0,0 +1,22 @@ +No need to run as its for reference only + + +DECLARE @BackupSet AS INT +SELECT @BackupSet = position + FROM msdb..backupset + WHERE database_name='ApressFinancial' + AND backup_set_id= + (SELECT MAX(backup_set_id) + FROM msdb..backupset s + WHERE database_name='ApressFinancial') +IF @BackupSet IS NULL +BEGIN + RAISERROR('Verify failed. Backup information for database + ''ApressFinancial'' not found.', 16, 1) +END +RESTORE VERIFYONLY +FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\ +ApressFinancial\ApressFinancial_backup_200508061136.bak' +WITH FILE = @BackupSet, +NOUNLOAD, +NOREWIND diff --git a/1-59059-720-6/Chapter12/4-IN.sql b/1-59059-720-6/Chapter12/4-IN.sql new file mode 100644 index 0000000..3cbfcf1 --- /dev/null +++ b/1-59059-720-6/Chapter12/4-IN.sql @@ -0,0 +1,3 @@ +SELECT * + FROM ShareDetails.Shares + WHERE ShareId IN (1,3,5) \ No newline at end of file diff --git a/1-59059-720-6/Chapter12/5-IN-Subquery.sql b/1-59059-720-6/Chapter12/5-IN-Subquery.sql new file mode 100644 index 0000000..88b7003 --- /dev/null +++ b/1-59059-720-6/Chapter12/5-IN-Subquery.sql @@ -0,0 +1,8 @@ +SELECT * + FROM ShareDetails.Shares + WHERE ShareId IN (SELECT ShareId + FROM ShareDetails.Shares + WHERE CurrentPrice > (SELECT MIN(CurrentPrice) + FROM ShareDetails.Shares) + AND CurrentPrice < (SELECT MAX(CurrentPrice) + FROM ShareDetails.Shares)) diff --git a/1-59059-720-6/Chapter12/6-IN-OR.sql b/1-59059-720-6/Chapter12/6-IN-OR.sql new file mode 100644 index 0000000..132bd45 --- /dev/null +++ b/1-59059-720-6/Chapter12/6-IN-OR.sql @@ -0,0 +1,5 @@ +SELECT * + FROM ShareDetails.Shares + WHERE ShareId = 1 + OR ShareId = 3 + OR ShareId = 5 diff --git a/1-59059-720-6/Chapter12/7-NOT-EXISTS.sql b/1-59059-720-6/Chapter12/7-NOT-EXISTS.sql new file mode 100644 index 0000000..e8ab870 --- /dev/null +++ b/1-59059-720-6/Chapter12/7-NOT-EXISTS.sql @@ -0,0 +1,5 @@ +SELECT * + FROM ShareDetails.Shares s + WHERE NOT EXISTS (SELECT 1 + FROM TransactionDetails.Transactions t + WHERE t.RelatedShareId = s.ShareId) diff --git a/1-59059-720-6/Chapter12/8-CROSS-APPLY.sql b/1-59059-720-6/Chapter12/8-CROSS-APPLY.sql new file mode 100644 index 0000000..8f72115 --- /dev/null +++ b/1-59059-720-6/Chapter12/8-CROSS-APPLY.sql @@ -0,0 +1,27 @@ +CREATE FUNCTION TransactionDetails.ReturnTransactions +(@CustId bigint) RETURNS @Trans TABLE +(TransactionId bigint, +CustomerId bigint, +TransactionDescription nvarchar(30), +DateEntered datetime, +Amount money) +AS +BEGIN + INSERT INTO @Trans + SELECT TransactionId, CustomerId, TransactionDescription, + DateEntered, Amount + FROM TransactionDetails.Transactions t + JOIN TransactionDetails.TransactionTypes tt ON + tt.TransactionTypeId = t.TransactionType + WHERE CustomerId = @CustId + RETURN +END +GO +SELECT c.CustomerFirstName, CustomerLastName, +Trans.TransactionId,TransactionDescription, +DateEntered,Amount +FROM CustomerDetails.Customers AS c + CROSS APPLY + TransactionDetails.ReturnTransactions(c.CustomerId) + AS Trans + diff --git a/1-59059-720-6/Chapter12/9-OUTER-APPLY.sql b/1-59059-720-6/Chapter12/9-OUTER-APPLY.sql new file mode 100644 index 0000000..4479ac0 --- /dev/null +++ b/1-59059-720-6/Chapter12/9-OUTER-APPLY.sql @@ -0,0 +1,7 @@ +SELECT c.CustomerFirstName, CustomerLastName, +Trans.TransactionId,TransactionDescription, +DateEntered,Amount +FROM CustomerDetails.Customers AS c + OUTER APPLY + TransactionDetails.ReturnTransactions(c.CustomerId) + AS Trans diff --git a/1-59059-720-6/Chapter12/readme.txt b/1-59059-720-6/Chapter12/readme.txt new file mode 100644 index 0000000..052e341 --- /dev/null +++ b/1-59059-720-6/Chapter12/readme.txt @@ -0,0 +1,4 @@ + + +Robin Dewson +www.fat-belly.com \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/1-Create Trigger.sql b/1-59059-720-6/Chapter13/1-Create Trigger.sql new file mode 100644 index 0000000..b6dc405 --- /dev/null +++ b/1-59059-720-6/Chapter13/1-Create Trigger.sql @@ -0,0 +1,17 @@ +CREATE TRIGGER trgInsTransactions +ON TransactionDetails.Transactions +AFTER INSERT +AS +UPDATE CustomerDetails.Customers +SET ClearedBalance = ClearedBalance + +(SELECT CASE WHEN CreditType = 0 +THEN i.Amount * -1 +ELSE i.Amount +END +FROM INSERTED i +JOIN TransactionDetails.TransactionTypes tt +ON tt.TransactionTypeId = i.TransactionType +WHERE AffectCashBalance = 1) +FROM CustomerDetails.Customers c +JOIN INSERTED i ON i.CustomerId = c.CustomerId +GO \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/10-Test-AlterUpdate.sql b/1-59059-720-6/Chapter13/10-Test-AlterUpdate.sql new file mode 100644 index 0000000..7868674 --- /dev/null +++ b/1-59059-720-6/Chapter13/10-Test-AlterUpdate.sql @@ -0,0 +1,15 @@ +SELECT * +FROM TransactionDetails.Transactions +WHERE TransactionId=5 +SELECT ClearedBalance +FROM CustomerDetails.Customers +WHERE CustomerId = 1 +UPDATE TransactionDetails.Transactions +SET DateEntered = DATEADD(dd,-1,DateEntered) +WHERE TransactionId = 5 +SELECT * +FROM TransactionDetails.Transactions +WHERE TransactionId=5 +SELECT ClearedBalance +FROM CustomerDetails.Customers +WHERE CustomerId = 1 \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/12-COLUMNS-UPDATED.sql b/1-59059-720-6/Chapter13/12-COLUMNS-UPDATED.sql new file mode 100644 index 0000000..4fadf49 --- /dev/null +++ b/1-59059-720-6/Chapter13/12-COLUMNS-UPDATED.sql @@ -0,0 +1,35 @@ +ALTER TRIGGER TransactionDetails.trgInsTransactions +ON TransactionDetails.Transactions +AFTER UPDATE,INSERT +AS +IF (SUBSTRING(COLUMNS_UPDATED(),1,1) = power(2,(3-1)) +OR SUBSTRING(COLUMNS_UPDATED(),1,1) = power(2,(5-1))) +BEGIN +UPDATE CustomerDetails.Customers +SET ClearedBalance = ClearedBalance - +ISNULL((SELECT CASE WHEN CreditType = 0 +THEN d.Amount * -1 +ELSE d.Amount +END +FROM DELETED d +JOIN TransactionDetails.TransactionTypes tt +ON tt.TransactionTypeId = d.TransactionType +WHERE AffectCashBalance = 1),0) +FROM CustomerDetails.Customers c +JOIN DELETED d ON d.CustomerId = c.CustomerId +UPDATE CustomerDetails.Customers +SET ClearedBalance = ClearedBalance + +ISNULL((SELECT CASE WHEN CreditType = 0 +THEN i.Amount * -1 +ELSE i.Amount +END +FROM INSERTED i +JOIN TransactionDetails.TransactionTypes tt +ON tt.TransactionTypeId = i.TransactionType +WHERE AffectCashBalance = 1),0) +FROM CustomerDetails.Customers c +JOIN INSERTED i ON i.CustomerId = c.CustomerId +RAISERROR ('We have completed an update ',10,1) +END +ELSE +RAISERROR ('Updates have been skipped',10,1) \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/13-DDL Trigger.sql b/1-59059-720-6/Chapter13/13-DDL Trigger.sql new file mode 100644 index 0000000..14529c5 --- /dev/null +++ b/1-59059-720-6/Chapter13/13-DDL Trigger.sql @@ -0,0 +1,14 @@ +CREATE TRIGGER trgSprocs +ON DATABASE +FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE +AS +IF DATEPART(hh,GETDATE()) > 9 AND DATEPART(hh,GETDATE()) < 17 +BEGIN +DECLARE @Message nvarchar(max) +SELECT @Message = +'Completing work during core hours. Trying to release - ' ++ EVENTDATA().value +('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') +RAISERROR (@Message, 16, 1) +ROLLBACK +END \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/14-Test-DDL-Trigger.sql b/1-59059-720-6/Chapter13/14-Test-DDL-Trigger.sql new file mode 100644 index 0000000..01b43ff --- /dev/null +++ b/1-59059-720-6/Chapter13/14-Test-DDL-Trigger.sql @@ -0,0 +1,3 @@ +CREATE PROCEDURE Test1 +AS +SELECT 'Hello all' \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/15-Drop-DDL-Trigger.sql b/1-59059-720-6/Chapter13/15-Drop-DDL-Trigger.sql new file mode 100644 index 0000000..aa2f02e --- /dev/null +++ b/1-59059-720-6/Chapter13/15-Drop-DDL-Trigger.sql @@ -0,0 +1 @@ +DROP TRIGGER trgSprocs ON DATABASE \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/16-CreateSecondDDLTrigger.sql b/1-59059-720-6/Chapter13/16-CreateSecondDDLTrigger.sql new file mode 100644 index 0000000..e2b115e --- /dev/null +++ b/1-59059-720-6/Chapter13/16-CreateSecondDDLTrigger.sql @@ -0,0 +1,5 @@ +CREATE TRIGGER trgDBDump +ON DATABASE +FOR DDL_DATABASE_LEVEL_EVENTS +AS +SELECT EVENTDATA() \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/17-Test-DDL-2.sql b/1-59059-720-6/Chapter13/17-Test-DDL-2.sql new file mode 100644 index 0000000..01b43ff --- /dev/null +++ b/1-59059-720-6/Chapter13/17-Test-DDL-2.sql @@ -0,0 +1,3 @@ +CREATE PROCEDURE Test1 +AS +SELECT 'Hello all' \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/2-Test Trigger.sql b/1-59059-720-6/Chapter13/2-Test Trigger.sql new file mode 100644 index 0000000..5fc0d9c --- /dev/null +++ b/1-59059-720-6/Chapter13/2-Test Trigger.sql @@ -0,0 +1,9 @@ +SELECT ClearedBalance +FROM CustomerDetails.Customers +WHERE customerId=1 +INSERT INTO TransactionDetails.Transactions (CustomerId,TransactionType, +Amount,RelatedProductId, DateEntered) +VALUES (1,2,200,1,GETDATE()) +SELECT ClearedBalance +FROM CustomerDetails.Customers +WHERE customerId=1 \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/3-Noncash Test.sql b/1-59059-720-6/Chapter13/3-Noncash Test.sql new file mode 100644 index 0000000..76bdff9 --- /dev/null +++ b/1-59059-720-6/Chapter13/3-Noncash Test.sql @@ -0,0 +1,9 @@ +SELECT ClearedBalance +FROM CustomerDetails.Customers +WHERE customerId=1 +INSERT INTO TransactionDetails.Transactions (CustomerId,TransactionType, +Amount,RelatedProductId, DateEntered) +VALUES (1,3,200,1,GETDATE()) +SELECT ClearedBalance +FROM CustomerDetails.Customers +WHERE customerId=1 \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/4-InspectingTransactionDetails.sql b/1-59059-720-6/Chapter13/4-InspectingTransactionDetails.sql new file mode 100644 index 0000000..4fa663b --- /dev/null +++ b/1-59059-720-6/Chapter13/4-InspectingTransactionDetails.sql @@ -0,0 +1,3 @@ +SELECT * +FROM TransactionDetails.Transactions +WHERE CustomerId=1 \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/5-AlterTrigger.sql b/1-59059-720-6/Chapter13/5-AlterTrigger.sql new file mode 100644 index 0000000..5c1e8c2 --- /dev/null +++ b/1-59059-720-6/Chapter13/5-AlterTrigger.sql @@ -0,0 +1,16 @@ +ALTER TRIGGER TransactionDetails.trgInsTransactions +ON TransactionDetails.Transactions +AFTER INSERT +AS +UPDATE CustomerDetails.Customers +SET ClearedBalance = ClearedBalance + +ISNULL((SELECT CASE WHEN CreditType = 0 +THEN i.Amount * -1 +ELSE i.Amount +END +FROM INSERTED i +JOIN TransactionDetails.TransactionTypes tt +ON tt.TransactionTypeId = i.TransactionType +WHERE AffectCashBalance = 1),0) +FROM CustomerDetails.Customers c +JOIN INSERTED i ON i.CustomerId = c.CustomerId \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/6-NonCash-Retest.sql b/1-59059-720-6/Chapter13/6-NonCash-Retest.sql new file mode 100644 index 0000000..76bdff9 --- /dev/null +++ b/1-59059-720-6/Chapter13/6-NonCash-Retest.sql @@ -0,0 +1,9 @@ +SELECT ClearedBalance +FROM CustomerDetails.Customers +WHERE customerId=1 +INSERT INTO TransactionDetails.Transactions (CustomerId,TransactionType, +Amount,RelatedProductId, DateEntered) +VALUES (1,3,200,1,GETDATE()) +SELECT ClearedBalance +FROM CustomerDetails.Customers +WHERE customerId=1 \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/7-UPDATE-Trigger.sql b/1-59059-720-6/Chapter13/7-UPDATE-Trigger.sql new file mode 100644 index 0000000..2f744c7 --- /dev/null +++ b/1-59059-720-6/Chapter13/7-UPDATE-Trigger.sql @@ -0,0 +1,28 @@ +ALTER TRIGGER TransactionDetails.trgInsTransactions +ON TransactionDetails.Transactions +AFTER INSERT,UPDATE +AS +UPDATE CustomerDetails.Customers +SET ClearedBalance = ClearedBalance - +ISNULL((SELECT CASE WHEN CreditType = 0 +THEN d.Amount * -1 +ELSE d.Amount +END +FROM DELETED d +JOIN TransactionDetails.TransactionTypes tt +ON tt.TransactionTypeId = d.TransactionType +WHERE AffectCashBalance = 1),0) +FROM CustomerDetails.Customers c +JOIN DELETED d ON d.CustomerId = c.CustomerId +UPDATE CustomerDetails.Customers +SET ClearedBalance = ClearedBalance + +ISNULL((SELECT CASE WHEN CreditType = 0 +THEN i.Amount * -1 +ELSE i.Amount +END +FROM INSERTED i +JOIN TransactionDetails.TransactionTypes tt +ON tt.TransactionTypeId = i.TransactionType +WHERE AffectCashBalance = 1),0) +FROM CustomerDetails.Customers c +JOIN INSERTED i ON i.CustomerId = c.CustomerId \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/8-Test-UPDATE.sql b/1-59059-720-6/Chapter13/8-Test-UPDATE.sql new file mode 100644 index 0000000..85e0933 --- /dev/null +++ b/1-59059-720-6/Chapter13/8-Test-UPDATE.sql @@ -0,0 +1,15 @@ +SELECT * +FROM TransactionDetails.Transactions +WHERE CustomerId = 1 +SELECT ClearedBalance +FROM CustomerDetails.Customers +WHERE CustomerId = 1 +UPDATE TransactionDetails.Transactions +SET Amount = 100 +WHERE TransactionId = 5 +SELECT * +FROM TransactionDetails.Transactions +WHERE CustomerId = 1 +SELECT ClearedBalance +FROM CustomerDetails.Customers +WHERE CustomerId = 1 \ No newline at end of file diff --git a/1-59059-720-6/Chapter13/9-AlterUPDATE.sql b/1-59059-720-6/Chapter13/9-AlterUPDATE.sql new file mode 100644 index 0000000..911c9cc --- /dev/null +++ b/1-59059-720-6/Chapter13/9-AlterUPDATE.sql @@ -0,0 +1,34 @@ +ALTER TRIGGER TransactionDetails.trgInsTransactions +ON TransactionDetails.Transactions +AFTER INSERT,UPDATE +AS +IF UPDATE(Amount) OR Update(TransactionType) +BEGIN +UPDATE CustomerDetails.Customers +SET ClearedBalance = ClearedBalance - +ISNULL((SELECT CASE WHEN CreditType = 0 +THEN d.Amount * -1 +ELSE d.Amount +END +FROM DELETED d +JOIN TransactionDetails.TransactionTypes tt +ON tt.TransactionTypeId = d.TransactionType +WHERE AffectCashBalance = 1),0) +FROM CustomerDetails.Customers c +JOIN DELETED d ON d.CustomerId = c.CustomerId +UPDATE CustomerDetails.Customers +SET ClearedBalance = ClearedBalance + +ISNULL((SELECT CASE WHEN CreditType = 0 +THEN i.Amount * -1 +ELSE i.Amount +END +FROM INSERTED i +JOIN TransactionDetails.TransactionTypes tt +ON tt.TransactionTypeId = i.TransactionType +WHERE AffectCashBalance = 1),0) +FROM CustomerDetails.Customers c +JOIN INSERTED i ON i.CustomerId = c.CustomerId +RAISERROR ('We have completed an update',10,1) +END +ELSE +RAISERROR ('Updates have been skipped',10,1) \ No newline at end of file diff --git a/1-59059-720-6/Chapter14/1-ReportStructure.sql b/1-59059-720-6/Chapter14/1-ReportStructure.sql new file mode 100644 index 0000000..3e802b8 --- /dev/null +++ b/1-59059-720-6/Chapter14/1-ReportStructure.sql @@ -0,0 +1,8 @@ +USE ApressFinancial +GO +CREATE TABLE CustomerDetails.Title +(CustomerTitleId int primary key,TitleDescription varchar(16)) +GO +INSERT INTO CustomerDetails.Title VALUES (1,'Mr') +INSERT INTO CustomerDetails.Title VALUES (2,'Ms') +INSERT INTO CustomerDetails.Title VALUES (3,'Dr') \ No newline at end of file diff --git a/3354.pdf b/3354.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dd0afdbde68d67e9d129131120f49c6c85d0754c GIT binary patch literal 2298313 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