@@ -6,8 +6,8 @@ use crate::{AppState, Database};
66use anyhow:: Context ;
77use async_trait:: async_trait;
88use sqlparser:: ast:: {
9- BinaryOperator , DataType , Expr , Function , FunctionArg , FunctionArgExpr , Ident , ObjectName ,
10- Statement , Value , VisitMut , VisitorMut ,
9+ BinaryOperator , CharacterLength , DataType , Expr , Function , FunctionArg , FunctionArgExpr , Ident ,
10+ ObjectName , Statement , Value , VisitMut , VisitorMut ,
1111} ;
1212use sqlparser:: dialect:: { Dialect , MsSqlDialect , MySqlDialect , PostgreSqlDialect , SQLiteDialect } ;
1313use sqlparser:: parser:: { Parser , ParserError } ;
@@ -326,6 +326,10 @@ impl ParameterExtractor {
326326 let data_type = match self . db_kind {
327327 // MySQL requires CAST(? AS CHAR) and does not understand CAST(? AS TEXT)
328328 AnyKind :: MySql => DataType :: Char ( None ) ,
329+ AnyKind :: Mssql => DataType :: Varchar ( Some ( CharacterLength {
330+ length : 8000 ,
331+ unit : None ,
332+ } ) ) ,
329333 _ => DataType :: Text ,
330334 } ;
331335 let value = Expr :: Value ( Value :: Placeholder ( name) ) ;
@@ -712,7 +716,7 @@ mod test {
712716 let parameters = ParameterExtractor :: extract_parameters ( & mut ast, AnyKind :: Mssql ) ;
713717 assert_eq ! (
714718 ast. to_string( ) ,
715- "SELECT CONCAT('', CAST(@p1 AS TEXT )) FROM [a schema].[a table]"
719+ "SELECT CONCAT('', CAST(@p1 AS VARCHAR(8000) )) FROM [a schema].[a table]"
716720 ) ;
717721 assert_eq ! ( parameters, [ StmtParam :: GetOrPost ( "1" . to_string( ) ) , ] ) ;
718722 }
0 commit comments