diff --git a/Language/SQL/SimpleSQL/Dialect.lhs b/Language/SQL/SimpleSQL/Dialect.lhs
index e3e0c99..4a85f97 100644
--- a/Language/SQL/SimpleSQL/Dialect.lhs
+++ b/Language/SQL/SimpleSQL/Dialect.lhs
@@ -44,8 +44,8 @@ hack for now, later will expand to flags on a feature by feature basis
 
 > -- | oracle dialect
 > oracle :: Dialect
-> oracle = Dialect Postgres
+> oracle = Dialect Oracle
 
 > -- | microsoft sql server dialect
 > sqlserver :: Dialect
-> sqlserver = Dialect Postgres
+> sqlserver = Dialect SQLServer
diff --git a/Language/SQL/SimpleSQL/Lex.lhs b/Language/SQL/SimpleSQL/Lex.lhs
index fa4651d..e4ed1d3 100644
--- a/Language/SQL/SimpleSQL/Lex.lhs
+++ b/Language/SQL/SimpleSQL/Lex.lhs
@@ -82,11 +82,13 @@ todo: public documentation on dialect definition - and dialect flags
 >     -- the quotes used, or nothing if no quotes were used. The quotes
 >     -- can be " or u& or something dialect specific like []
 >     | Identifier (Maybe (String,String)) String
-
+>
 >     -- | This is a host param symbol, e.g. :param
 >     | HostParam String
-
-
+>
+>     -- | This is a prefixed variable symbol, such as @var or #var (not used in ansi dialect)
+>     | PrefixedVariable Char String
+>
 >     -- | This is a positional arg identifier e.g. $1
 >     | PositionalArg Int
 >
@@ -95,6 +97,7 @@ todo: public documentation on dialect definition - and dialect flags
 >     -- the character set (one of nNbBxX, or u&, U&), or a dialect
 >     -- specific string quoting (such as $$ in postgres)
 >     | SqlString String String String
+>
 >     -- | A number literal (integral or otherwise), stored in original format
 >     -- unchanged
 >     | SqlNumber String
@@ -122,6 +125,7 @@ todo: public documentation on dialect definition - and dialect flags
 > prettyToken _ (Identifier Nothing t) = t
 > prettyToken _ (Identifier (Just (q1,q2)) t) = q1 ++ t ++ q2
 > prettyToken _ (HostParam p) = ':':p
+> prettyToken _ (PrefixedVariable c p) = c:p
 > prettyToken _ (PositionalArg p) = '$':show p
 > prettyToken _ (SqlString s e t) = s ++ t ++ e
 > prettyToken _ (SqlNumber r) = r
@@ -177,6 +181,7 @@ this is also tried before symbol (a .1 will be parsed as a number, but
 >                     ,sqlNumber d
 >                     ,positionalArg d
 >                     ,dontParseEndBlockComment d
+>                     ,prefixedVariable d
 >                     ,symbol d
 >                     ,sqlWhitespace d]
 
@@ -292,11 +297,18 @@ There might be a problem with parsing e.g. a[1:b]
 
 > hostParam _ = HostParam <$> (char ':' *> identifierString)
 
+> prefixedVariable :: Dialect -> Parser Token
+> prefixedVariable  d | diSyntaxFlavour d == SQLServer =
+>     PrefixedVariable <$> char '@' <*> identifierString
+> prefixedVariable  d | diSyntaxFlavour d == Oracle =
+>     PrefixedVariable <$> char '#' <*> identifierString
+> prefixedVariable _ = guard False *> fail "unpossible"
+
 > positionalArg :: Dialect -> Parser Token
 > positionalArg d | diSyntaxFlavour d == Postgres =
 >   -- use try to avoid ambiguities with other syntax which starts with dollar
 >   PositionalArg <$> try (char '$' *> (read <$> many1 digit))
-> positionalArg _ = guard False *> error "unpossible"
+> positionalArg _ = guard False *> fail "unpossible"
 
 
 digits
@@ -700,6 +712,17 @@ identifier:
 >         (s':_) -> not (isDigit s')
 >         _ -> True
 
+> tokensWillPrintAndLex d PrefixedVariable {} b =
+>     case prettyToken d b of
+>         (h:_) | h == '_' || isAlphaNum h -> False
+>         _ -> True
+
+> tokensWillPrintAndLex (Dialect {diSyntaxFlavour = Postgres})
+>                       Symbol {} (PrefixedVariable {}) = False
+
+> tokensWillPrintAndLex _ _ PrefixedVariable {} = True
+
+
 > tokensWillPrintAndLex _ PositionalArg {} Symbol {} = True
 > tokensWillPrintAndLex _ PositionalArg {} Identifier {} = True
 > tokensWillPrintAndLex _ PositionalArg {} HostParam {} = True
@@ -741,7 +764,7 @@ is an unambiguous parse
 TODO:
 
 refactor the tokenswillprintlex to be based on pretty printing the
-individual tokens
+ individual tokens
 
 start adding negative / different parse dialect tests
 
@@ -753,7 +776,9 @@ make a new ctor for @var, #var
 
 add token tables and tests for oracle, sql server
 review existing tables
-look for refactoring opportunities
+
+look for refactoring opportunities, especially the token
+generation tables in the tests
 
 add odbc as a dialect flag and include {} as symbols when enabled
 
diff --git a/tools/Language/SQL/SimpleSQL/LexerTests.lhs b/tools/Language/SQL/SimpleSQL/LexerTests.lhs
index 269d4ec..d85eb2d 100644
--- a/tools/Language/SQL/SimpleSQL/LexerTests.lhs
+++ b/tools/Language/SQL/SimpleSQL/LexerTests.lhs
@@ -282,14 +282,14 @@ the + or -.
 > sqlServerLexerTests :: TestItem
 > sqlServerLexerTests = Group "sqlServerLexTests" $
 >     [ LexTest sqlserver s t | (s,t) <-
->     [--("@variable", [(Identifier (Just ("@", "")) "variable")])
+>     [("@variable", [(PrefixedVariable '@' "variable")])
 >     --,("[quoted identifier]", [(Identifier (Just ("[", "]")) "variable")])
 >     ]]
 
 > oracleLexerTests :: TestItem
 > oracleLexerTests = Group "oracleLexTests" $
 >     [ LexTest oracle s t | (s,t) <-
->     [--("#variable", [(Identifier (Just ("#", "")) "variable")])
+>     [("#variable", [(PrefixedVariable '#' "variable")])
 >     ]
 >     ]