1

我从代码调用存储过程时遇到问题。

我的存储过程:

ALTER PROCEDURE [dbo].[ChangePassword]
    @param1 sysname,
    @param2 sysname

AS
BEGIN
DECLARE @sql nvarchar(500)
SET @sql = 'ALTER LOGIN ' + @param1 + ' WITH PASSWORD = '''+ @param2 +'''';
EXEC sp_executesql @sql

END;

当我从 SQL 编辑器运行它时工作正常,但是当我从函数调用它时:

        using (var command = new OdbcCommand("{call ChangePassword(?,?)}", connection))
        {
            try
            {
                command.CommandType = CommandType.StoredProcedure;
                //command.Parameters.AddWithValue("@param1", user.Username);
                //command.Parameters.AddWithValue("@param2", user.password);

                command.Parameters.Add("@param1", OdbcType.VarChar, 50).Value = user.Username;
                command.Parameters.Add("@param2", OdbcType.VarChar, 50).Value = user.password;

                connection.Open();
                command.ExecuteNonQuery();
                connection.Close();
                return true;
            }

我收到错误

ERROR [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'MYPASSWORD'. 

@param2 附近

请有人可以帮我解决这个问题。

我找到了方法... :)

   ALTER PROCEDURE [dbo].[ChangePassword]
    @param1 sysname,
    @param2 sysname

AS
BEGIN
DECLARE @sql nvarchar(500)
SET @sql = 'ALTER LOGIN ' + @param1 + ' WITH PASSWORD = '+ @param2 +'';
EXEC sp_executesql @sql

END;

使用这些语法:) 但是现在当我从 SQL 编辑器运行时,我遇到了与以前版本的存储过程中从函数调用时相同的错误。

有人可以解释一下吗?

编辑

决赛要感谢 Marc Gravell:

ALTER PROCEDURE [dbo].[ChangePassword]
    @param1 sysname,
    @param2 sysname

AS
BEGIN
DECLARE @SQL nvarchar(4000)

SET @SQL = N'ALTER LOGIN ' + QUOTENAME(@param1) + N' WITH PASSWORD = ' + QUOTENAME(@param2,'''');
EXEC(@SQL);

END;

谢谢

4

2 回答 2

0

我认为登录名也应该有双(')..

'ALTER LOGIN ''' + @param1 + ''' WITH PASSWORD = '''+ @param2 +'''';
于 2013-10-23T13:49:20.683 回答
0

这里需要混合使用不同的转义规则;用户名需要[]转义,密码需要'转义;在这种情况下,两者都不能参数化。幸运的是,QUOTENAME在这里帮助了我们,例如:

-- this is just for example; this could be sp parameters etc
declare @username sysname = 'ab;drop table users;--',
        @password sysname = 'mwah''a''haha';

declare @sql nvarchar(4000) = N'alter login ' + QUOTENAME(@username)
    + N' with password = ' + QUOTENAME(@password, '''');

exec(@sql);

注意:我应该注意到,这似乎很奇怪。我也想对可能的输入进行一些清理,个人(尤其是用户名)。

于 2013-10-23T13:59:05.340 回答