仅使用字符串

时间:2017-09-20 15:35:24

标签: c# sql-server

好的,为了避免“为什么你这样做”的评论和问题,让我解释一下,我正在一个非常古老的应用程序的范围内工作。长话短说,我需要用参数创建一个查询,我需要把它传递给数据访问方法,只不过是一个字符串。

我不能将除字符串之外的任何内容传递给此方法,该方法将字符串视为查询并尝试针对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'"

为了记录,我尝试了它并且它不起作用

3 个答案:

答案 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。