Difference between revisions of "SQL Snippets"

From SpenchWiki
Jump to: navigation, search
m
(Clever EXISTS ( SELECT 1 ) JOIN trick)
Line 137: Line 137:
 
EXEC sp_executesql @sql, N'@b VARBINARY(MAX) OUTPUT', @b OUTPUT
 
EXEC sp_executesql @sql, N'@b VARBINARY(MAX) OUTPUT', @b OUTPUT
 
GO
 
GO
 +
</syntaxhighlight>
 +
 +
* Clever EXISTS ( SELECT 1 ) JOIN trick
 +
 +
<syntaxhighlight lang="tsql">
 +
SELECT  r2.*
 +
FROM    (
 +
        SELECT  TOP 50 CustomerID
 +
        FROM    (
 +
                SELECT  MovieID
 +
                FROM    Ratings
 +
                WHERE  CustomerID = 915
 +
                ) q
 +
        JOIN    Ratings r
 +
        ON      r.MovieID = q.MovieID
 +
                AND CustomerID <> 915
 +
                AND EXISTS
 +
                (
 +
                SELECT  1
 +
                FROM    Ratings re
 +
                WHERE  re.MovieID = 1
 +
                        AND re.CustomerID = r.CustomerID
 +
                )
 +
        GROUP BY
 +
                CustomerID
 +
        ORDER BY
 +
                COUNT(*) DESC
 +
        ) ro
 +
JOIN    Ratings r2
 +
ON      r2.MovieID = 1
 +
        AND r2.CustomerID = ro.CustomerID
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 20:14, 11 April 2011

  • Cannot have ORDER BY clause in a view's definition
  • Finding a sproc in the meta-database
SELECT *
    FROM INFORMATION_SCHEMA.ROUTINES 
   WHERE SPECIFIC_NAME = N'uspFindComponent'
     AND SPECIFIC_SCHEMA = N'<Schema_Name, sysname, Schema_Name>'

Special data types

  • Declaring a table variable
DECLARE @TableVar TABLE (Cola int PRIMARY KEY, Colb char(3))

INSERT INTO @TableVar VALUES (1, 'abc')
INSERT INTO @TableVar VALUES (2, 'def')

SELECT * FROM @TableVar
GO
  • WHERE EXISTS condition
SELECT Version FROM LanguageVersion WHERE EXISTS
	(
		SELECT * FROM LanguageVersion
	)
  • Selecting results into a table variable & CTE using WITH
DECLARE @i int
DECLARE @t TABLE (L bigint, ID bigint, V nvarchar(64))
INSERT @t
EXEC @i = uspFindLanguageVersion 'My Language'
SELECT V FROM @t
SELECT @i AS 'Return'
GO

WITH DirReps(ManagerID, DirectReports) AS
(
    SELECT Version, Language
    FROM LanguageVersion AS e
)
SELECT ManagerID, DirectReports
FROM DirReps
ORDER BY ManagerID;
GO
  • TRANSACTION
BEGIN TRANSACTION;

BEGIN TRY

-- Statements

END TRY
BEGIN CATCH
 SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() as ErrorState,
        ERROR_PROCEDURE() as ErrorProcedure,
        ERROR_LINE() as ErrorLine,
        ERROR_MESSAGE() as ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
	RETURN(1);
END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
	RETURN(0);
  • MSDN links
  • Derived query
SELECT     ComponentName.Name, derivedtbl_1.ID
FROM         ComponentName CROSS JOIN
                          (SELECT     ID
                            FROM          Component) AS derivedtbl_1
	WHERE derivedtbl_1.ID = ComponentName.Component
  • INNER JOIN
SELECT     ComponentReference.Reference, ComponentReference.Component, Reference.Location, ComponentReference.ID
FROM         ComponentReference INNER JOIN
                      Reference ON ComponentReference.Reference = Reference.ID
WHERE     (ComponentReference.Component = 983)
  • Generating a GUID
DECLARE @id uniqueidentifier
SET @id = NEWID()
DECLARE @txt nvarchar(36)
SET @txt = CONVERT(nvarchar(36), @id)
SELECT @id, @txt, LEN(@txt)
  • Procedure for converting a hexadecimal string into the original binary data
CREATE PROCEDURE dbo.uspHexToBinary
	@s nvarchar(MAX),
	@b varbinary(MAX) OUT
AS
	DECLARE @sql nvarchar(MAX)
	SET @sql = 'SELECT @b = ' + @s
	EXEC sp_executesql @sql, N'@b VARBINARY(MAX) OUTPUT', @b OUTPUT
GO
  • Clever EXISTS ( SELECT 1 ) JOIN trick
SELECT  r2.*
FROM    (
        SELECT  TOP 50 CustomerID
        FROM    (
                SELECT  MovieID
                FROM    Ratings
                WHERE   CustomerID = 915
                ) q
        JOIN    Ratings r
        ON      r.MovieID = q.MovieID
                AND CustomerID <> 915
                AND EXISTS
                (
                SELECT  1
                FROM    Ratings re
                WHERE   re.MovieID = 1
                        AND re.CustomerID = r.CustomerID
                )
        GROUP BY
                CustomerID
        ORDER BY
                COUNT(*) DESC
        ) ro
JOIN    Ratings r2
ON      r2.MovieID = 1
        AND r2.CustomerID = ro.CustomerID