Skip to content

Commit a355c1b

Browse files
committed
Results' commit.
1 parent 8c89889 commit a355c1b

2 files changed

Lines changed: 132 additions & 0 deletions

File tree

CloneSP.sql

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.CloneSP') AND type in (N'P', N'PC'))
2+
DROP PROCEDURE dbo.CloneSP
3+
GO
4+
5+
6+
7+
/*
8+
Creates a clone from an existing stored procedure with partially replaced SQL code.
9+
*/
10+
CREATE PROCEDURE dbo.CloneSP
11+
12+
@source_name NVARCHAR(250),
13+
@target_name NVARCHAR(250),
14+
15+
@sub1_from NVARCHAR(250),
16+
@sub1_to NVARCHAR(250),
17+
18+
@sub2_from NVARCHAR(250),
19+
@sub2_to NVARCHAR(250)
20+
21+
AS
22+
BEGIN
23+
24+
PRINT ''
25+
PRINT '@@ Start: Generation of ' + @target_name + ' from ' + @source_name;
26+
PRINT ''
27+
PRINT 'ANSI_WARNINGS is ' + CONVERT(VARCHAR(10), SESSIONPROPERTY('ANSI_WARNINGS')) + '; ANSI_NULLS is ' + CONVERT(VARCHAR(10), SESSIONPROPERTY('ANSI_NULLS')) + '; QUOTED_IDENTIFIER is ' + CONVERT(VARCHAR(10), SESSIONPROPERTY('QUOTED_IDENTIFIER'));
28+
PRINT ''
29+
30+
DECLARE @db_name NVARCHAR(250);
31+
SELECT @db_name = DB_NAME();
32+
33+
WHILE 1 = 1
34+
BEGIN
35+
36+
SET NOCOUNT ON;
37+
38+
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@source_name) AND type in (N'P', N'PC'))
39+
BEGIN
40+
PRINT 'Interrupted. The "' + @source_name + '" stored procedure doesn''t exist.'
41+
BREAK;
42+
END;
43+
44+
IF @target_name IS NULL OR RTRIM(LTRIM(@target_name)) = ''
45+
BEGIN
46+
PRINT 'Interrupted. Parameter "' + @target_name + '" is NULL or EMPTY.'
47+
BREAK;
48+
END;
49+
50+
51+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@target_name) AND type in (N'P', N'PC'))
52+
BEGIN
53+
PRINT 'Dropping of existing ' + @target_name
54+
55+
DECLARE @drop_target_sql NVARCHAR(500) = 'DROP PROCEDURE ' + @target_name;
56+
EXEC (@drop_target_sql);
57+
END;
58+
59+
60+
DECLARE @db_source_name NVARCHAR(500) = @db_name + N'.' + @source_name
61+
DECLARE @initial_sql NVARCHAR(MAX) = OBJECT_DEFINITION (OBJECT_ID(@db_source_name));
62+
--SET @initial_sql;
63+
64+
DECLARE @result_sql NVARCHAR(MAX) =
65+
REPLACE(
66+
REPLACE(@initial_sql, @sub1_from, @sub1_to),
67+
@sub2_from, @sub2_to)
68+
;
69+
70+
71+
/*
72+
-- Debug. Outputs first sybols only.
73+
PRINT @result_sql;
74+
75+
-- Debut. Outputs full SQL without line-breaks.
76+
DECLARE @t_od TABLE(line NVARCHAR(MAX));
77+
INSERT INTO @t_od SELECT @result_sql AS line;
78+
SELECT * FROM @t_od;
79+
*/
80+
81+
82+
EXECUTE sp_executesql @result_sql;
83+
84+
85+
PRINT '';
86+
PRINT 'Successfully done'
87+
PRINT '';
88+
-- !!!
89+
-- !!! Deletion of the following BREAK instruction will destroy DB deployment, at all!
90+
-- !!!
91+
BREAK;
92+
END;
93+
PRINT '@@ End: Generation of ' + @target_name + ' from ' + @source_name;
94+
95+
END;

try-me-after-install-CloneSP.sql

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
2+
3+
4+
-- !!! Please, run after installing CloneSP.sql !!! --
5+
6+
7+
8+
9+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.MySampleSP') AND type in (N'P', N'PC')) DROP PROCEDURE dbo.MySampleSP
10+
GO
11+
CREATE PROCEDURE dbo.MySampleSP AS BEGIN
12+
PRINT '';
13+
PRINT 'SELECT tb.* FROM Server_level_alias__Linked_server.MyDb.dbo.MyTable AS tb;';
14+
SELECT '<Server_level_alias__Linked_server>' AS [Linked server alias];
15+
END;
16+
GO
17+
18+
EXEC MySampleSP;
19+
20+
21+
-- ! Often must have ANSI_NULLS ON to create a cloned SP.
22+
SET ANSI_NULLS ON;
23+
24+
EXECUTE CloneSP
25+
@source_name = '[dbo].[MySampleSP]',
26+
@target_name = '[dbo].[MyClonedSP]',
27+
28+
@sub1_from = 'Server_level_alias__Linked_server',
29+
@sub1_to = 'Replaced_alias__Other_linked_server',
30+
31+
@sub2_from = 'MySampleSP',
32+
@sub2_to = 'MyClonedSP'
33+
;
34+
35+
36+
EXEC MyClonedSP;
37+

0 commit comments

Comments
 (0)