sp_executesql 使用复杂的 Unicode 表达式

本文介绍了一种在SQL查询中使用动态字段名时遇到的语法错误及其解决方案。通过使用sp_executesql存储过程和NVARCHAR(MAX)类型的变量,可以避免因字符串连接引起的语法问题。

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '+'.

 

当你尝试执行下面这段代码时,会得到如上这个错误提示。

ExpandedBlockStart.gif View Code
  DECLARE  @MyName  NVARCHAR( 100)
  DECLARE  @FieldName SYSNAME  = N ' Name '
  EXECUTE sp_executesql N ' SELECT TOP 1 @OutputName = [ ' +  @FieldName  + ' ] FROM [dbo].[Member] ',
                       N ' @OutputName NVARCHAR(100) OUTPUT ',
                        @MyName OUTPUT;
   SELECT   @MyName

 

问题出于不允许使用更复杂的 Unicode 表达式(例如使用 + 运算符连接两个字符串)。可以参考:http://technet.microsoft.com/zh-cn/library/ms188001.aspx

[ @statement = ] statement

包含 Transact-SQL 语句或批处理的 Unicode 字符串。statement 必须是 Unicode 常量或 Unicode 变量。不允许使用更复杂的 Unicode 表达式(例如使用 + 运算符连接两个字符串)。不允许使用字符常量。如果指定了 Unicode 常量,则必须使用 N 作为前缀。例如,Unicode 常量 N'sp_who' 是有效的,但是字符常量 'sp_who' 则无效。字符串的大小仅受可用数据库服务器内存限制。在 64 位服务器中,字符串大小限制为 2 GB,即 nvarchar(max) 的最大大小。

 

解决问题,可以宣告一个变量如下代码DECLARE @sql NVARCHAR(MAX),把带动态的数据名,表名或是字段的SQL语句赋值于这个变量, 然后用这个变量传入sp_executesql中。

ExpandedBlockStart.gif View Code
  DECLARE  @MyName  NVARCHAR( 100)
  DECLARE  @FieldName SYSNAME  = N ' Name '
  DECLARE  @sql  NVARCHAR( MAX= N ' SELECT TOP 1 @OutputName = [ ' +  @FieldName  + ' ] FROM [dbo].[Member] '
  EXECUTE sp_executesql  @sql,
                       N ' @OutputName NVARCHAR(100) OUTPUT ',
                        @MyName OUTPUT;
   SELECT   @MyName

 

变通一下,问题轻而易举解决。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值