@@ -86,7 +86,8 @@ private async Task GenerateSqlConstStringAsync(string inputFilePath)
8686
8787 var hasDeclarationSection = sqlParserTokens . Any ( x => x . TokenType == TSqlTokenType . SingleLineComment && x . Text == options . EndOfParameterDeclarationMarker ) ;
8888 var endOfParameterDeclarationMarkerFound = false ;
89- var parameterNames = new List < string > ( ) ;
89+ var declaredParameters = new Dictionary < string , string > ( ) ;
90+ var foundParameterDeclaration = String . Empty ;
9091 var sqlCodeBuilder = new StringBuilder ( ) ;
9192 var whiteSpaceBuffer = new StringBuilder ( ) ;
9293 foreach ( var token in sqlParserTokens )
@@ -101,9 +102,16 @@ private async Task GenerateSqlConstStringAsync(string inputFilePath)
101102
102103 if ( token . TokenType == TSqlTokenType . Variable )
103104 {
104- parameterNames . Add ( token . Text ) ;
105+ foundParameterDeclaration = token . Text ;
106+ declaredParameters . Add ( foundParameterDeclaration , string . Empty ) ;
105107 continue ;
106108 }
109+
110+ if ( token . TokenType == TSqlTokenType . Identifier && ! string . IsNullOrEmpty ( foundParameterDeclaration ) )
111+ {
112+ declaredParameters [ foundParameterDeclaration ] = token . Text ;
113+ foundParameterDeclaration = string . Empty ;
114+ }
107115 }
108116 else
109117 {
@@ -131,6 +139,15 @@ private async Task GenerateSqlConstStringAsync(string inputFilePath)
131139 continue ;
132140 }
133141
142+ if ( token . TokenType == TSqlTokenType . Variable )
143+ {
144+ if ( ! declaredParameters . ContainsKey ( token . Text ) )
145+ {
146+ await outputPane . WriteLineAsync ( $ "\t Variable { token . Text } is used in the query, but it is not defined in the 'Parameter Declarat") ;
147+ return ;
148+ }
149+ }
150+
134151 if ( whiteSpaceBuffer . Length > 0 )
135152 {
136153 sqlCodeBuilder . Append ( whiteSpaceBuffer . ToString ( ) ) ;
@@ -155,7 +172,13 @@ private async Task GenerateSqlConstStringAsync(string inputFilePath)
155172 await conn . OpenAsync ( ) ;
156173 try
157174 {
158- conn . Query ( $ "DECLARE @sql NVARCHAR(MAX) = '{ sqlCode . Replace ( "'" , "''" ) } '; EXEC sp_describe_first_result_set @sql;") ;
175+ //conn.Query($"DECLARE @sql NVARCHAR(MAX) = '{sqlCode.Replace("'", "''")}'; EXEC sp_describe_first_result_set @sql;");
176+ //conn.Query($"DECLARE @sql NVARCHAR(MAX) = '{sqlCode.Replace("'", "''")}'; DECLARE @params NVARCHAR(MAX) = '{string.Join(", ", declaredParameters.Select(x => $"{x.Key} {x.Value}"))}'; EXEC sp_describe_first_result_set @sql, @params;").ToList();
177+ var queryBuilder = new StringBuilder ( ) ;
178+ queryBuilder . AppendLine ( $ "DECLARE @sql NVARCHAR(MAX) = '{ sqlCode . Replace ( "'" , "''" ) } ';") ;
179+ queryBuilder . AppendLine ( $ "DECLARE @params NVARCHAR(MAX) = '{ string . Join ( ", " , declaredParameters . Select ( x => $ "{ x . Key } { x . Value } ") ) } ';") ;
180+ queryBuilder . AppendLine ( "EXEC sp_describe_first_result_set @sql, @params;" ) ;
181+ conn . Query ( queryBuilder . ToString ( ) ) . ToList ( ) ;
159182 }
160183 catch ( SqlException ex )
161184 {
@@ -211,7 +234,7 @@ private async Task GenerateSqlConstStringAsync(string inputFilePath)
211234 contentBuilder . AppendLine ( $ "\t {{") ;
212235 contentBuilder . AppendLine ( $ "\t \t public const string Query = @\" { sqlCode } \" ;") ;
213236
214- foreach ( var name in parameterNames )
237+ foreach ( var name in declaredParameters . Keys )
215238 {
216239 contentBuilder . AppendLine ( ) ;
217240 contentBuilder . AppendLine ( $ "\t \t public const string { name } = @\" { name } \" ;") ;
0 commit comments