【问题标题】:how use replace in exec statement in sql server 2008如何在 sql server 2008 的 exec 语句中使用替换
【发布时间】: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 只是将给定的数据插入到表中,但会在途中检查一些验证和外键..

标签: sql sql-server-2008 stored-procedures replace exec


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-06-28
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      相关资源
      最近更新 更多