p.c*_*ell 21 t-sql sql-server-2005
场景:需要将n个参数传递给存储过程.其中一个论点是类型varchar(x).该varchar参数需要从少数其他varchar变量构造.此问题使用SQL Server 2005,但此行为适用于所有版本的SQL Server.
设置:
DECLARE @MyString varchar(500), @MyBar varchar(10), @MyFoo varchar(10)
SELECT @MyBar= 'baz '
SELECT @MyFoo= 'bat '
-- try calling this stored procedure!
EXEC DoSomeWork @MsgID, 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".'
Run Code Online (Sandbox Code Playgroud)
这在SQL Server中产生异常:Incorrect syntax near '+'.通常,您可能认为数据类型是错误的(即变量属于不同类型,但会产生不同的错误消息).
这是一个没有错误编译的正确实现:
SELECT @MyString= 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".';
EXEC DoSomeWork @ID, @MyString
Run Code Online (Sandbox Code Playgroud)
问题:为什么 T-SQL无法处理varchar作为参数的串联?它知道类型,因为它们被正确地声明为varchar.
Sur*_*ish 22
EXECUTE语句只有与SELECT和SET等其他语句不同的语法.例如,请观察以下两页顶部的语法部分.
EXECUTE声明:http://msdn.microsoft.com/en-us/library/ms188332.aspx
SET声明:http://msdn.microsoft.com/en-us/library/ms189484.aspx
EXECUTE的语法只接受一个值
[[@parameter =] { value | @variable [OUTPUT] | [默认]]
而SET的语法接受表达式
{@local_variable = expression }
值基本上只是一个硬编码常量,但是将对表达式进行求值.这就像拥有varchar'SELECT 1 + 1'.它现在只是一个varchar值.但是,您可以像这样评估字符串:
EXEC('SELECT 1 + 1')
Run Code Online (Sandbox Code Playgroud)
我想我所指出的是,EXEC命令不允许根据定义使用表达式,您显然已经发现了这些表达式.我不知道T-SQL开发人员的意图是什么时候他们这样做的.我想如果你允许在存储过程的参数列表中的子查询中抛出子查询,那么语法就会失控.
T-SQL表达式:http://msdn.microsoft.com/en-us/library/ms190286.aspx