如何在 sql server 2008 的 exec 语句中使用替换

Posted

技术标签:

【中文标题】如何在 sql server 2008 的 exec 语句中使用替换【英文标题】:how use replace in exec statement in sql server 2008 【发布时间】:2011-05-01 06:30:18 【问题描述】:

我有一个存储过程,比如“call_Me”,参数很少:

Declare @Greet varchar(100) = 'Hi ||User||'

Exec Call_Me 1,'something', @Greet --parameters: bit, string, string

在通话过程中,我希望能够更换

||User||

有点别的东西。通常,在选择语句中,我会这样做:

select 1, 'something', Replace(@Greet, '||User||', u.Username) from UserTable

效果很好,但是今天,我第一次尝试在 exec 语句中使用它,错误说它期望选择,我尝试以所有可能(和明智的)方式添加选择,但它似乎没有锻炼。

如何在执行语句调用期间使用替换?

非常感谢!

【问题讨论】:

你能举一个使用替换调用存储过程的例子吗?是否要循环调用此 SP(对于许多用户名)? SP 只是将给定的数据插入到表中,但会在途中检查一些验证和外键.. 【参考方案1】:

在将@Greet 传递给存储过程之前,您需要对其进行格式化:

Declare @Greet varchar(100) = 'Hi ||User||'
SELECT @Greet = Replace(@Greet, '||User||', u.Username) 
FROM UserTable u
WHERE Id = 1

Exec Call_Me 1,'something', @Greet --parameters: bit, string, string

【讨论】:

我想到了这一点,但缺点是一旦我替换了原始字符串,||user||将不再在那里,所以我不能再次使用它。但我想我会用另一个变量来做这件事。谢谢。【参考方案2】:

您只能在过程调用中使用文字或变量引用:

[  EXEC | EXECUTE  ]
     
      [ @return_status= ]
       module_name [ ;number ] | @module_name_var  
        [ [ @parameter= ]  value 
                           | @variable [ OUTPUT ] 
                           | [ DEFAULT ] 
                           
        ]
      [ ,...n ]
      [ WITH RECOMPILE ]
    
[;]

使用这个:

Declare @Greet varchar(100) = 'Hi ||User||'
Declare @param VARCHAR(100) = REPLACE(@Greet, '||User||', 'replacement')

Exec Call_Me 1,'something', @param

【讨论】:

【参考方案3】:

我不确定我是否正确理解了您的问题,但也许使用光标可以解决您的问题:

DECLARE CURSOR users LOCAL FAST_FORWARD FOR
    SELECT 
        username
    FROM
        usertable

OPEN

DECLARE @username NVARCHAR(50)
DECLARE @Greet VARCHAR(100) = 'Hi ||User||'

FETCH NEXT FROM users INTO @username

WHILE @@FETCH_STATUS = 0 BEGIN

    EXEC Call_Me 1, 'something', REPLACE(@Greet, '||User||', @username)

    FETCH NEXT FROM users INTO @username
END

CLOSE users
DEALLOCATE users

如果您不需要循环中调用它,您可以尝试类似(这可以是一个新的存储过程):

DECLARE @username NVARCHAR(50)
DECLARE @Greet VARCHAR(100) = 'Hi ||User||'

SELECT
    @username = username
FROM
    usernames
WHERE
    user_id = 1

IF @@ROWCOUNT = 1 BEGIN
    EXEC Call_Me 1, 'something', REPLACE(@Greet, '||User||', @username)
END

【讨论】:

以上是关于如何在 sql server 2008 的 exec 语句中使用替换的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2008怎么安装实例

怎么单击sql server 2008的setup.exe没有反应?进程里面也没用,只弹出一个dos窗口,一会也就没了?

SQL Server 2008R2的安装

sql server2008升级到2008 R2出现问题

Microsoft SQL Server 2008 Express Service Pack 1(x89)安装失败

windows server 2012 可以安装sql2008 吗