好的,为了避免“为什么你这样做”的评论和问题,让我解释一下,我正在一个非常古老的应用程序的范围内工作。长话短说,我需要用参数创建一个查询,我需要把它传递给数据访问方法,只不过是一个字符串。
我不能将除字符串之外的任何内容传递给此方法,该方法将字符串视为查询并尝试针对sql-server-2008-r2数据库执行它。
他们的方法接受发送给它的任何字符串,并使用它在数据库中执行EXEC(string)
。
所以,我试图找出如何传入一个从sql注入安全的字符串,并且仍然可以执行。
所以,例如,我可以传入这个字符串:
"SELECT * FROM myTable WHERE myColumn = '12345' "
使用SSMS(我有只读访问权限)我可以这样做:
EXECUTE sp_executesql
N'SELECT * FROM myTable where myColum = @myColumn',
N'@myColumn nvarchar(250)',
@myColumn = N'12345'
在C#中,我想避免的是:
string query = string.format("SELECT * FROM myTable WHERE myColumn = '{0}', var);
再次回到SSMS,我正在玩弄如何让它发挥作用:
EXEC(????)
那么,我如何创建一个可以传递给这个古老方法的单个字符串,该方法可以在SQL EXEC()
内工作?
我试过这个:
EXEC ('EXECUTE sp_executesql N''SELECT * myTable where myColumn = @myColumn', N'@myColumn nvarchar(250)'', @myColumn = N''12345''')
但是这让我知道了:
')'附近的语法不正确。
我甚至不知道这是否有效,如果可行,我不知道我的语法错误在哪里。
修改
再次在SSMS中,此查询有效:
EXEC('SELECT * FROM myTable WHERE MyColumn = '12345')
我只是不确定如何将所有这些结合起来,以便当我所能做的只是传入一个字符串时,它可以使用参数。
再次编辑:
我看到我在问这个问题时做得不好,所以让我再试一次:
您只能将字符串传递给方法。该字符串将在DB中执行如下:
EXEC(yourString).
我的问题是:是否可以传入实际查询:
"select * from myTable where myColumn = '12345' "
但是......是否可以传入一个如下所示的字符串:
"EXECUTE sp_executesql N'SELECT * from myTable WHERE myColumn = @myColumn', N'@myColumn nvarchar(250)', @myColumn = N'12345'"
为了记录,我尝试了它并且它不起作用
答案 0 :(得分:1)
尝试这种方式:
EXEC ('EXECUTE sp_executesql N''SELECT * FROM mytable where myColumn = @myColumn'', N''@myColumn nvarchar(250)'', @myColumn = N''12345'' ')
答案 1 :(得分:1)
好像你没有取代所有的'没有'' -
EXEC ( 'EXECUTE sp_executesql N''SELECT * FROM myTable where myColum = @myColumn'', N''@myColumn nvarchar(250)'', @myColumn = N''12345''')
答案 2 :(得分:1)
也许这可以帮到你
DECLARE @sqlCommand nvarchar(1000)
DECLARE @myColumn nvarchar(75)
DECLARE @executeCommand nvarchar(1000)
SET @myColumn = '12345'
SET @sqlCommand = 'SELECT * from myTable where myColumn = @myColumn'
SET @executeCommand = 'EXECUTE sp_executesql N' + char(39) + @sqlCommand + char(39) + ', N''@myColumn nvarchar(75)'', @myColumn = '+ CHAR(39) + @myColumn + CHAR(39)
EXEC(@executeCommand)
请注意,CHAR(39)连接是因为变量@myColumn被声明为varchar。