T-SQL:无法将连接字符串作为参数传递给存储过程

时间:2009-06-25 16:17:41

标签: sql-server-2005 tsql

方案: 需要将 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 + '".'

这会在SQL Server中生成异常:Incorrect syntax near '+'。通常,您可能认为数据类型是错误的(即变量属于不同类型,但会产生不同的错误消息)。

这是一个没有错误编译的正确实现:

SELECT @MyString= 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".';

EXEC DoSomeWork @ID, @MyString

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

3 个答案:

答案 0 :(得分:21)

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

执行声明:http://msdn.microsoft.com/en-us/library/ms188332.aspx

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

EXECUTE的语法只接受

  

[[@ parameter =] { | @变量   [输出] | [默认]]

而SET的语法接受表达式

  

{@local_variable = 表达}

值基本上只是一个硬编码常量,但是将对表达式进行求值。这就像拥有varchar'SELECT 1 + 1'。它现在只是一个varchar值。但是,您可以评估字符串,如下所示:

EXEC('SELECT 1 + 1')

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

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

答案 1 :(得分:2)

你不能做这样的事情

exec SomeProc getdate()

你必须将所有这些东西放在一个参数中,就像你在底层查询中所做的一样 这可能是因为它是非确定性的(至少对于函数而言)

答案 2 :(得分:2)

这是对EXEC声明的限制。有关详细信息,请参阅 The curse and blessings of dynamic SQL