Пример #1
0
 public void Reset()
 {
     Parameters.Clear();
     CodeSenseMessages.Clear();
     CodeSenseErrors.Clear();
     ExecutionParameters.Clear();
 }
Пример #2
0
        public override void ExplicitVisit(DeclareVariableStatement node)
        {
            if (node == null || node.Declarations == null)
            {
                return;
            }

            StringBuilder codeSenseMessageStringBuilder = new StringBuilder();
            int           endLine = -1;
            int           endCol  = -1;

            foreach (DeclareVariableElement declareVariableElement in node.Declarations)
            {
                if (declareVariableElement.DataType is SqlDataTypeReference dataTypeReference)
                {
                    SqlDataTypeOption sqlDataTypeOption = dataTypeReference.SqlDataTypeOption;

                    if (ShouldParamterize(sqlDataTypeOption))
                    {
                        IList <Literal> sqlDataTypeParameters = dataTypeReference.Parameters;
                        ScalarExpressionTransformer.SqlDataTypeOption     = sqlDataTypeOption;
                        ScalarExpressionTransformer.SqlDataTypeParameters = sqlDataTypeParameters;
                        ScalarExpressionTransformer.VariableName          = declareVariableElement.VariableName.Value;

                        ScalarExpression declareVariableElementValue = declareVariableElement.Value;
                        ScalarExpressionTransformer.ExplicitVisit(declareVariableElementValue);
                        declareVariableElement.Value = ScalarExpressionTransformer.GetTransformedExpression();
                        IList <SqlParameter> sqlParameters = ScalarExpressionTransformer.Parameters;

                        if (sqlParameters.Count == 1 && declareVariableElementValue != null)
                        {
                            codeSenseMessageStringBuilder.Append(SR.ParameterizationDetails(declareVariableElement.VariableName.Value,
                                                                                            sqlParameters[0].SqlDbType.ToString(),
                                                                                            sqlParameters[0].Size,
                                                                                            sqlParameters[0].Precision,
                                                                                            sqlParameters[0].Scale,
                                                                                            sqlParameters[0].SqlValue.ToString()));

                            endLine = declareVariableElementValue.StartLine;
                            endCol  = declareVariableElementValue.StartColumn + declareVariableElementValue.FragmentLength;

                            if (!IsCodeSenseRequest)
                            {
                                string sqlParameterKey = sqlParameters[0].SqlDbType.ToString();
                                ExecutionParameters.TryGetValue(sqlParameterKey, out int currentCount);
                                ExecutionParameters[sqlParameterKey] = currentCount + 1;
                            }
                        }

                        Parameters.AddRange(sqlParameters);
                        ScalarExpressionTransformer.Reset();
                    }
                }
            }

            if (codeSenseMessageStringBuilder.Length > 0)
            {
                CodeSenseMessages.Add(new ScriptFileMarker
                {
                    Level        = ScriptFileMarkerLevel.Information,
                    Message      = codeSenseMessageStringBuilder.ToString(),
                    ScriptRegion = new ScriptRegion
                    {
                        StartLineNumber   = node.StartLine,
                        StartColumnNumber = node.StartColumn,
                        EndLineNumber     = endLine == -1 ? node.StartLine : endLine,
                        EndColumnNumber   = endCol == -1 ? node.StartColumn + node.LastTokenIndex - node.FirstTokenIndex : endCol
                    }
                });
            }

            node.AcceptChildren(this);
            base.ExplicitVisit(node); // let the base class finish up
        }