Advertisement
reathh

TSQL

Feb 19th, 2015
368
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 5.38 KB | None | 0 0
  1. --1. Create a database with two tables
  2. --Persons (id (PK), first name, last name, SSN)
  3. CREATE TABLE Persons
  4. (
  5. Id INT PRIMARY KEY IDENTITY NOT NULL,
  6. FirstName nvarchar(50) NOT NULL,
  7. LastName nvarchar(50) NOT NULL,
  8. SSN nvarchar(50) NOT NULL UNIQUE,
  9. )
  10. GO
  11. --Accounts (id (PK), person id (FK), balance). Insert few records for testing.
  12. CREATE TABLE Accounts
  13. (
  14. Id INT PRIMARY KEY IDENTITY NOT NULL,
  15. PersonId INT NOT NULL,
  16. CONSTRAINT fk_PersonId FOREIGN KEY (PersonId) REFERENCES Persons(Id),
  17. Balance MONEY
  18. )
  19. GO
  20.  
  21. --Insert some data
  22. INSERT INTO Persons VALUES ('Asen', 'Asenov', '136-426-632')
  23. INSERT INTO Persons VALUES ('Ivan', 'Ivanov', '174-135-163')
  24. INSERT INTO Persons VALUES ('Petkan', 'Petkanov', '306-760-158')
  25. INSERT INTO Persons VALUES ('Pesho', 'Peshkov', '306-760-158') --Should throw error because of UNIQUE key constraint
  26. INSERT INTO Persons VALUES ('Pesho', 'Peshkov', '307-560-158')
  27.  
  28. INSERT INTO Accounts VALUES (1, 0)
  29. INSERT INTO Accounts VALUES (2, 1230)
  30. INSERT INTO Accounts VALUES (3, 10640.36)
  31. INSERT INTO Accounts VALUES (3, 5320.24)
  32.  
  33. SELECT * FROM Accounts
  34. GO
  35. --Write a stored procedure that selects the full names of all persons.
  36. CREATE PROCEDURE dbo.getFullNameOfPersons
  37. AS
  38.    SELECT FirstName + ' ' + LastName AS [FULL Name]
  39.    FROM Persons
  40. GO
  41.  
  42. EXEC dbo.getFullNameOfPersons
  43. GO
  44. --2. Create a stored procedure
  45. CREATE PROCEDURE dbo.getAllAccountsWithMoreMoney(@Money MONEY)
  46. AS
  47.     SELECT FirstName, LastName, a.Balance
  48.     FROM Persons p
  49.         JOIN Accounts a ON a.PersonId = p.Id
  50.     WHERE a.Balance >= @Money
  51. GO
  52.  
  53. DECLARE @Money MONEY = 5000;
  54. EXEC dbo.getAllAccountsWithMoreMoney @Money
  55.  
  56. SET @Money = 10000;
  57. EXEC dbo.getAllAccountsWithMoreMoney @Money
  58. GO
  59.  
  60. --3. Create a function with parameters
  61. CREATE FUNCTION dbo.udf_calculateSumAfterMonthsWithInterestRate(@Money MONEY, @InterestRate FLOAT, @Months INT)
  62. RETURNS MONEY
  63. AS
  64. BEGIN
  65.     DECLARE @InterestPerMonth MONEY = @Money * (@InterestRate / 100)
  66.     RETURN (@InterestPerMonth * @Months) + @Money
  67. END
  68. GO
  69.  
  70. DECLARE @Money MONEY = 100;
  71. DECLARE @InterestRate INT = 20;
  72. DECLARE @Months INT = 2;
  73.  
  74. SELECT dbo.udf_calculateSumAfterMonthsWithInterestRate(@Money, @InterestRate, @Months)
  75. GO
  76.  
  77. --4. Create a stored procedure that uses the function from the previous example.
  78. CREATE PROCEDURE dbo.udp_calculateAccountSumAfterInterestRateForOneMonth(@AccountId INT, @InterestRate FLOAT)
  79. AS
  80.     SELECT dbo.udf_calculateSumAfterMonthsWithInterestRate(Balance, @InterestRate, 1)
  81.     FROM Accounts
  82.     WHERE Id = @AccountId
  83. GO
  84.  
  85. EXEC dbo.udp_calculateAccountSumAfterInterestRateForOneMonth @AccountId = 4, @InterestRate = 100
  86. GO
  87.  
  88. --5. Add two more procedures
  89. CREATE PROCEDURE dbo.udp_withdrawMoney(@AccountId INT, @Money MONEY)
  90. AS
  91.     DECLARE @NewBalance MONEY = ((SELECT Balance FROM Accounts WHERE Id = @AccountId) - @Money)
  92.     IF (@NewBalance >= 0)
  93.     BEGIN
  94.         UPDATE Accounts
  95.         SET Balance = @NewBalance
  96.         WHERE Id = @AccountId
  97.     END
  98.     ELSE
  99.     BEGIN
  100.         RAISERROR('Not enough money to withdraw', 15, 1)
  101.     END
  102. GO
  103.  
  104. CREATE PROCEDURE dbo.udp_depositMoney(@AccountId INT, @Money MONEY)
  105. AS
  106.     UPDATE Accounts
  107.     SET Balance = Balance + @Money
  108.     WHERE Id = @AccountId
  109. GO
  110.  
  111. DECLARE @AccountId INT = 1
  112. DECLARE @Money INT = 100
  113. SELECT Balance FROM Accounts WHERE Id = @AccountId;
  114.  
  115. EXEC dbo.udp_depositMoney @AccountId = @AccountId, @Money = @Money;
  116. SELECT Balance FROM Accounts WHERE Id = @AccountId;
  117.  
  118. EXEC dbo.udp_withdrawMoney @AccountId = @AccountId, @Money = @Money;
  119. SELECT Balance FROM Accounts WHERE Id = @AccountId;
  120.  
  121. EXEC dbo.udp_withdrawMoney @AccountId = 1, @Money = 1000000; --Should raise error
  122. GO
  123.  
  124. --6. Create table Logs
  125. CREATE TABLE Logs
  126. (
  127.     Id INT PRIMARY KEY IDENTITY NOT NULL,
  128.     AccountId INT NOT NULL,
  129.     CONSTRAINT fk_AccountId FOREIGN KEY (AccountId) REFERENCES Accounts(Id),
  130.     OldSum MONEY NOT NULL,
  131.     NewSum MONEY NOT NULL
  132. )
  133. GO
  134. --Add trigers
  135.  
  136. CREATE TRIGGER accounts_balanceUpdate ON Accounts
  137. FOR UPDATE
  138. AS
  139.     DECLARE @OldBalance MONEY = (SELECT OLD.Balance FROM DELETED OLD)
  140.     DECLARE @NewBalance MONEY = (SELECT NEW.Balance FROM INSERTED NEW)
  141.  
  142.     IF (@OldBalance != @NewBalance)
  143.     BEGIN
  144.         DECLARE @AccountId INT = (SELECT Id FROM INSERTED)
  145.         INSERT INTO Logs VALUES (@AccountId, @OldBalance, @NewBalance)
  146.     END
  147. GO
  148.  
  149. --Test trigers
  150.  
  151. DECLARE @Money INT = 300.34
  152.  
  153. EXEC dbo.udp_depositMoney @AccountId = 2, @Money = @Money;
  154. EXEC dbo.udp_withdrawMoney @AccountId = 3, @Money = @Money;
  155.  
  156. SELECT * FROM Logs
  157. GO
  158.  
  159. --7. Define function in the SoftUni Database
  160. CREATE FUNCTION dbo.udf_checkIfInputIsComposedFromSetOfLetters
  161. (
  162.     @INPUT NVARCHAR(MAX),
  163.     @SetOfLetters NVARCHAR(MAX)
  164. )
  165. RETURNS BIT
  166. AS BEGIN
  167.     DECLARE @i INT = 1;
  168.     WHILE (@i <= LEN(@INPUT))
  169.     BEGIN
  170.         IF ( @SetOfLetters NOT LIKE '%' + SUBSTRING(@INPUT, @i, 1) + '%' ) BEGIN  
  171.             RETURN 0
  172.         END
  173.         SET @i = @i + 1
  174.     END
  175.     RETURN 1
  176. END
  177. GO
  178.  
  179. --Test the function
  180. DECLARE @SetOfLetters NVARCHAR(50) = 'oistmiahf'
  181.  
  182. SELECT FirstName
  183. FROM Employees
  184. WHERE dbo.udf_checkIfInputIsComposedFromSetOfLetters(FirstName, @SetOfLetters) = CAST(1 AS BIT)
  185.  
  186. SELECT MiddleName
  187. FROM Employees
  188. WHERE dbo.udf_checkIfInputIsComposedFromSetOfLetters(FirstName, @SetOfLetters) = CAST(1 AS BIT)
  189.  
  190. SELECT LastName
  191. FROM Employees
  192. WHERE dbo.udf_checkIfInputIsComposedFromSetOfLetters(LastName, @SetOfLetters) = CAST(1 AS BIT)
  193.  
  194. SELECT Name AS [Town Name]
  195. FROM Towns
  196. WHERE dbo.udf_checkIfInputIsComposedFromSetOfLetters(Name, @SetOfLetters) = CAST(1 AS BIT)
  197.  
  198. GO
  199. --
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement