如何在SQL Server 2008的exec语句中使用replace函数

8

我有一个存储过程,叫做“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语句中使用它时出现了错误,错误提示说需要select,我尝试以各种可能(并且合理)的方式添加select,但似乎都没有成功。

我该如何在execute语句调用中使用replace?

非常感谢您的帮助!


你能举个带有替换的存储过程调用的例子吗?你想在循环中调用这个存储过程(为多个用户名)吗? - Grzegorz Gierlik
该存储过程只是将给定的数据插入到表中,但在此过程中会进行一些验证和外键检查。 - iamserious
3个回答

3

在将@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||”就不再存在了,所以我不能再次使用它。但我想我会用另一个变量来实现这个。谢谢。 - iamserious

3

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

[ { 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

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接