首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >T-SQL:无法将连接的字符串作为参数传递给存储过程

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

Stack Overflow用户
提问于 2009-06-25 16:17:41
回答 3查看 15.6K关注 0票数 23

Scenario:需要向存储过程传递n个参数。其中一个参数的类型为varchar(x)。该varchar参数需要从少数其他varchar变量构造。此问题使用SQL Server2005,但此行为适用于所有版本的SQL Server。

设置

代码语言:javascript
复制
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 '+'。通常,您可能认为数据类型是错误的(即变量的类型不同,但这会产生不同的错误消息)。

下面是一个正确的实现,它编译时没有错误:

代码语言:javascript
复制
SELECT @MyString= 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".';

EXEC DoSomeWork @ID, @MyString

Question为什么不能处理变量字符作为参数的连接?它知道类型,因为它们被正确地声明为varchar。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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值。但是,您可以像这样计算字符串:

代码语言:javascript
复制
EXEC('SELECT 1 + 1')

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

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

票数 24
EN

Stack Overflow用户

发布于 2009-06-25 16:22:27

你也不能做这样的事情

代码语言:javascript
复制
exec SomeProc getdate()

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

票数 2
EN

Stack Overflow用户

发布于 2009-06-25 17:20:57

这是EXEC语句的一个限制。有关详细信息,请参阅。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1044831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档