2009-06-25 57 views
18

方案: 需要通过ň参数的存储过程。其中一个参数是varchar(x)。该varchar参数需要从少数其他varchar变量中构建。此问题使用SQL Server 2005,但此行为适用于所有版本的SQL Server。T-SQL:无法通过连接字符串作为参数传递给存储过程

设置

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 

问题为什么难道是T-SQL无法处理一个varchar作为参数的级联?它知道类型,因为它们被正确声明为varchar。

回答

19

EXECUTE语句与其他语句(如SELECT和SET)的语法不同。例如,观察以下两页顶部的语法部分。

EXECUTE语句:http://msdn.microsoft.com/en-us/library/ms188332.aspx

SET语句:http://msdn.microsoft.com/en-us/library/ms189484.aspx

仅执行语法接受

[[@parameter =] {value | @variable [OUTPUT] | [DEFAULT]]

鉴于语法SET接受一个表达

{@local_variable = expression}

值基本上只是一个硬编码常量,但表达式将被评估。这就像使用varchar'SELECT 1 + 1'。这只是一个varchar值。但是,您可以评估字符串是这样的:

EXEC('SELECT 1 + 1') 

我想所有我指出的是,EXEC命令不允许定义,你显然发现了已经表达。我不知道T-SQL开发人员的意图是什么,当他们这样做时。如果你允许在存储过程的参数列表的子查询中引入子查询,我想这个语法就会失控。

T-SQL表达式:http://msdn.microsoft.com/en-us/library/ms190286.aspx

+2

此评论中引用的网站不再有效。 – Buggieboy 2013-11-25 21:40:01

2

像你在你的底查询 做这可能是因为它是不确定性的(至少对函数你不能做这样的事情要么

exec SomeProc getdate() 

你必须把所有的东西在PARAM )

相关问题