我从代码调用存储过程时遇到问题。
我的存储过程:
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;
由于
答案 0 :(得分:0)
我认为登录应该有双倍(')..
'ALTER LOGIN ''' + @param1 + ''' WITH PASSWORD = '''+ @param2 +'''';
答案 1 :(得分: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);
注意:我应该注意,这似乎是一个奇怪的要求;我想要对可能的输入进行一点消毒,个人(特别是用户名)。