@@ -75,98 +75,64 @@ private async Task GenerateSqlConstStringAsync(string inputFilePath)
7575
7676 var sqlFileContent = doc . TextBuffer . CurrentSnapshot . GetText ( ) ;
7777 var parser = new TSql160Parser ( false ) ;
78- var sqlParserTokens = parser . GetTokenStream ( new StringReader ( sqlFileContent ) , out var sqlParserErrors ) ;
79- if ( sqlParserErrors . Count > 0 )
78+ var sqlStatementList = parser . ParseStatementList ( new StringReader ( sqlFileContent ) , out var sqlParserStatementsErrors ) ;
79+ if ( sqlParserStatementsErrors . Count > 0 )
8080 {
8181 await outputPane . WriteLineAsync ( "\t Code could not be generated due to the following sql parse errors:" ) ;
82- foreach ( var error in sqlParserErrors )
82+ var counter = 0 ;
83+ foreach ( var error in sqlParserStatementsErrors )
8384 {
84- await outputPane . WriteLineAsync ( $ "\t \t { error . Message } (line={ error . Line } , column={ error . Column } )") ;
85+ counter ++ ;
86+ await outputPane . WriteLineAsync ( $ "\t \t { counter } .) { error . Message } (line={ error . Line } , column={ error . Column } )") ;
8587 }
8688 return ;
8789 }
8890
89- var hasDeclarationSection = sqlParserTokens . Any ( x => x . TokenType == TSqlTokenType . SingleLineComment && x . Text == options . EndOfParameterDeclarationMarker ) ;
90- var endOfParameterDeclarationMarkerFound = false ;
91- var declaredParameters = new Dictionary < string , string > ( ) ;
92- var foundParameterDeclaration = String . Empty ;
91+ var parameterDeclarationList = new List < ( string Name , string Type ) > ( ) ;
9392 var sqlCodeBuilder = new StringBuilder ( ) ;
94- var whiteSpaceBuffer = new StringBuilder ( ) ;
95- foreach ( var token in sqlParserTokens )
93+ for ( int i = 0 ; i < sqlStatementList . Statements . Count ; i ++ )
9694 {
97- if ( hasDeclarationSection && endOfParameterDeclarationMarkerFound == false )
95+ if ( sqlStatementList . Statements [ i ] is DeclareVariableStatement variableStatement )
9896 {
99- if ( token . TokenType == TSqlTokenType . SingleLineComment && token . Text == options . EndOfParameterDeclarationMarker )
97+ foreach ( var declaration in variableStatement . Declarations )
10098 {
101- endOfParameterDeclarationMarkerFound = true ;
102- continue ;
103- }
104-
105- if ( token . TokenType == TSqlTokenType . Variable )
106- {
107- foundParameterDeclaration = token . Text ;
108- declaredParameters . Add ( foundParameterDeclaration , string . Empty ) ;
109- continue ;
110- }
111-
112- if ( token . TokenType == TSqlTokenType . Identifier && ! string . IsNullOrEmpty ( foundParameterDeclaration ) )
113- {
114- declaredParameters [ foundParameterDeclaration ] = token . Text ;
115- foundParameterDeclaration = string . Empty ;
116- }
117- }
118- else
119- {
120- if ( token . TokenType == TSqlTokenType . SingleLineComment )
121- {
122- continue ;
123- }
124-
125- if ( token . TokenType == TSqlTokenType . MultilineComment )
126- {
127- continue ;
128- }
129-
130- if ( token . TokenType == TSqlTokenType . WhiteSpace )
131- {
132- if ( sqlCodeBuilder . Length > 0 )
99+ var name = declaration . VariableName . Value ;
100+ var type = string . Empty ;
101+ for ( var j = declaration . DataType . FirstTokenIndex ; j <= declaration . DataType . LastTokenIndex ; j ++ )
133102 {
134- whiteSpaceBuffer . Append ( token . Text ) ;
103+ type += declaration . DataType . ScriptTokenStream [ j ] . Text ;
135104 }
136- continue ;
137- }
138-
139- if ( token . TokenType == TSqlTokenType . EndOfFile )
140- {
141- continue ;
105+ parameterDeclarationList . Add ( ( name , type ) ) ;
142106 }
107+ continue ;
108+ }
143109
144- if ( token . TokenType == TSqlTokenType . Variable )
145- {
146- if ( ! declaredParameters . ContainsKey ( token . Text ) )
147- {
148- await outputPane . WriteLineAsync ( $ "\t Variable { token . Text } is used in the query, but it is not defined in the 'Parameter Declarat") ;
149- return ;
150- }
151- }
110+ if ( sqlStatementList . Statements [ i ] is DeclareTableVariableStatement tableVariableStatement )
111+ {
112+ var name = tableVariableStatement . Body . VariableName . Value ;
113+ parameterDeclarationList . Add ( ( name , null ) ) ;
114+ }
152115
153- if ( whiteSpaceBuffer . Length > 0 )
154- {
155- sqlCodeBuilder . Append ( whiteSpaceBuffer . ToString ( ) ) ;
156- whiteSpaceBuffer . Clear ( ) ;
157- }
116+ for ( int j = sqlStatementList . Statements [ i ] . FirstTokenIndex ; j <= sqlStatementList . Statements [ i ] . LastTokenIndex ; j ++ )
117+ {
118+ sqlCodeBuilder . Append ( sqlStatementList . Statements [ i ] . ScriptTokenStream [ j ] . Text ) ;
119+ }
158120
159- sqlCodeBuilder . Append ( token . Text ) ;
121+ if ( ( i + 1 ) < sqlStatementList . Statements . Count )
122+ {
123+ sqlCodeBuilder . AppendLine ( ) ;
124+ sqlCodeBuilder . AppendLine ( ) ;
160125 }
161126 }
162127
163- var sqlCode = sqlCodeBuilder . ToString ( ) ;
164- if ( string . IsNullOrWhiteSpace ( sqlCode ) )
128+ if ( sqlCodeBuilder . Length <= 0 )
165129 {
166130 await outputPane . WriteLineAsync ( "\t Code could not be generated due to no sql code found." ) ;
167131 return ;
168132 }
169133
134+ var sqlCode = sqlCodeBuilder . ToString ( ) ;
135+
170136 List < SpDescribeFirstResultSetResult > queryMetaData ;
171137 try
172138 {
@@ -177,19 +143,20 @@ private async Task GenerateSqlConstStringAsync(string inputFilePath)
177143 {
178144 var queryBuilder = new StringBuilder ( ) ;
179145 queryBuilder . AppendLine ( $ "DECLARE @sql NVARCHAR(MAX) = '{ sqlCode . Replace ( "'" , "''" ) } ';") ;
180- queryBuilder . AppendLine ( $ "DECLARE @params NVARCHAR(MAX) = '{ string . Join ( ", " , declaredParameters . Select ( x => $ "{ x . Key } { x . Value } ") ) } ';") ;
146+ queryBuilder . AppendLine ( $ "DECLARE @params NVARCHAR(MAX) = '{ string . Join ( ", " , parameterDeclarationList . Where ( x => x . Type != null ) . Select ( x => $ "{ x . Name } { x . Type } ") ) } ';") ;
181147 queryBuilder . AppendLine ( "EXEC sp_describe_first_result_set @sql, @params;" ) ;
182148 queryMetaData = conn . Query < SpDescribeFirstResultSetResult > ( queryBuilder . ToString ( ) ) . ToList ( ) ;
183149 }
184150 catch ( SqlException ex )
185151 {
186152 await outputPane . WriteLineAsync ( "\t Code could not be generated due to the following sql parse errors:" ) ;
187-
153+ var counter = 0 ;
188154 foreach ( SqlError sqlError in ex . Errors )
189155 {
190156 if ( sqlError . Number == 11529 || sqlError . Number == 11501 ) continue ;
191157
192- await outputPane . WriteLineAsync ( $ "\t \t { sqlError . Message } ") ;
158+ counter ++ ;
159+ await outputPane . WriteLineAsync ( $ "\t \t { counter } .) { sqlError . Message } ") ;
193160 }
194161 return ;
195162 }
@@ -238,7 +205,7 @@ private async Task GenerateSqlConstStringAsync(string inputFilePath)
238205 var generateParameterNames = await inputPhysicalFile . GetGenerateParameterNamesAsync ( options . GenerateParameterNames ) ;
239206 if ( generateParameterNames )
240207 {
241- foreach ( var name in declaredParameters . Keys )
208+ foreach ( var name in parameterDeclarationList . Where ( x => x . Type != null ) . Select ( x => x . Name ) )
242209 {
243210 contentBuilder . AppendLine ( ) ;
244211 contentBuilder . AppendLine ( $ "\t \t public const string { name } = @\" { name } \" ;") ;
0 commit comments