-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGet_Where_String.dsql
67 lines (58 loc) · 3.23 KB
/
Get_Where_String.dsql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
CREATE PROC [dbo].[Get_Where_String] @Table_Name [VARCHAR](130),@IdentifyingColumns [VARCHAR](400),@SQL_String [VARCHAR](4000) OUT AS
/*
IF OBJECT_ID ('dbo.Get_Where_String', 'P') IS NOT NULL DROP PROCEDURE dbo.Get_Where_String
GO
###################################################################################################################
Example:
-------------------------------------------------------------------------------------------------------------------
DECLARE @SQL_String VARCHAR(4000)
EXEC dbo.Get_Where_String '[dbo].[Counties]','[CountyID]', @SQL_String OUTPUT
EXEC dbo.LongPrint @SQL_String
===================================================================================================================
Proc Description:
-------------------------------------------------------------------------------------------------------------------
This proc creating and returning part of SQL statement to use in Where statement in the special queries - uses only from PartitionSwitch procs.
Returning string like '[Table].[ColumnID] = [NSET].[ColumnID]'
@Table_Name - Table name (with Schema) is example for copy
@IdentifyingColumns - List of the columns to uniqually identify rows in both tables. Needed - can't be empty or Null.
@SQL_String - Param to return SQL statement.
###################################################################################################################
*/
BEGIN
/*====================================== TESTING =======================================================================*/
--DECLARE @SQL_String VARCHAR(4000), @Table_Name VARCHAR(200) = '[dbo].[Counties]', @IdentifyingColumns VARCHAR(100) = '[CountyID]'
/*====================================== TESTING =======================================================================*/
DECLARE @Error VARCHAR(MAX) = ''
IF @Table_Name IS NULL SET @Error = @Error + 'Table name cannot be NULL'
SET @SQL_String = '';
IF LEN(@Error) > 0
BEGIN
PRINT @Error
END
ELSE
BEGIN
DECLARE @Schema VARCHAR(100), @Table VARCHAR(200), @NUM_OF_COLUMNS INT, @ColumnName VARCHAR(100), @INDICAT INT = 1, @Delimiter_AND VARCHAR(5) = ''
DECLARE @Dot INT = CHARINDEX('.',@Table_Name)
SELECT
@Schema = CASE WHEN @Dot = 0 THEN 'dbo' ELSE REPLACE(REPLACE(REPLACE(LEFT(@Table_Name,@Dot),'[',''),']',''),'.','') END,
@Table = CASE WHEN @Dot = 0 THEN REPLACE(REPLACE(@Table_Name,'[',''),']','') ELSE REPLACE(REPLACE(SUBSTRING(@Table_Name,@Dot + 1,200),'[',''),']','') END
IF OBJECT_ID('tempdb..#Table_COLUMNS') IS NOT NULL DROP Table #Table_COLUMNS;
SELECT C.name AS ColumnName,
ROW_NUMBER() OVER(ORDER BY C.column_id) AS RN
INTO #Table_COLUMNS
FROM sys.columns C
JOIN sys.Tables t ON C.[object_id] = t.[object_id] AND t.name = @Table
JOIN sys.schemas s ON t.[schema_id] = s.[schema_id] AND s.name = @Schema
WHERE CHARINDEX('[' + C.name + ']', @IdentifyingColumns) > 0
SELECT @NUM_OF_COLUMNS = MAX(RN) FROM #Table_COLUMNS
WHILE (@INDICAT <= @NUM_OF_COLUMNS)
BEGIN
SELECT @ColumnName = M.ColumnName
FROM #Table_COLUMNS M
WHERE M.RN = @INDICAT
SET @SQL_String = @SQL_String + @Delimiter_AND + '[' +@Table + '].[' + @ColumnName + ']' + ' = [NSET].[' + @ColumnName + ']'
SET @Delimiter_AND = ' AND '
SET @INDICAT += 1
END
END
END