Scenario:需要向存储过程传递n个参数。其中一个参数的类型为varchar(x)
。该varchar参数需要从少数其他varchar变量构造。此问题使用SQL Server2005,但此行为适用于所有版本的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 + '".'
这将在SQL Server中产生异常:Incorrect syntax near '+'
。通常,您可能认为数据类型是错误的(即变量的类型不同,但这会产生不同的错误消息)。
下面是一个正确的实现,它编译时没有错误:
SELECT @MyString= 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".';
EXEC DoSomeWork @ID, @MyString
Question:为什么不能处理变量字符作为参数的连接?它知道类型,因为它们被正确地声明为varchar。
发布于 2009-06-25 20:18:33
EXECUTE语句的语法与SELECT和SET等其他语句的语法不同。例如,观察下面两页顶部的语法部分。
执行语句:http://msdn.microsoft.com/en-us/library/ms188332.aspx
SET语句:http://msdn.microsoft.com/en-us/library/ms189484.aspx
EXECUTE语法仅接受值
参数[@
= {value | @variable OUTPUT | DEFAULT]
而SET的语法接受表达式
{@local_variable =表达式}
值基本上只是一个硬编码的常量,但表达式将被求值。这就像是让varchar‘选择1+ 1’。它现在只是一个varchar值。但是,您可以像这样计算字符串:
EXEC('SELECT 1 + 1')
我想我要指出的是,EXEC命令不允许定义表达式,这一点您显然已经知道了。我不知道T-SQL的开发人员的意图是什么,当他们这样做的时候。我认为,如果允许您在存储过程的参数列表中的子查询中抛出子查询,那么语法就会失控。
T-SQL表达式:http://msdn.microsoft.com/en-us/library/ms190286.aspx
发布于 2009-06-25 16:22:27
你也不能做这样的事情
exec SomeProc getdate()
你必须把所有这些东西都放在一个参数中,就像你在底层查询中所做的那样,这可能是因为它是不确定的(至少对于函数而言)。
发布于 2009-06-25 17:20:57
这是EXEC语句的一个限制。有关详细信息,请参阅。
https://stackoverflow.com/questions/1044831
复制相似问题