代码之家  ›  专栏  ›  技术社区  ›  Jamie Taylor

SQL查询未输入我的变量的值

  •  0
  • Jamie Taylor  · 技术社区  · 14 年前

    我在使用变量编写查询时遇到一些问题。这是我的密码

    Dim bondnumber as String = "69836"
    
    Dim PasswordCheck As String = "DECLARE @investor varchar(10), 
    @thepassword varchar(20), @linkedserver2 varchar(25), @sql varchar(1000) "
    PasswordCheck += "SELECT @investor = '" & bondnumber & "', 
    @linkedserver2 = 'binfodev', "PasswordCheck += "@sql = 'SELECT * FROM ' + 
    @linkedserver2 + ' WHERE bondno = ''@investor'' ' EXEC(@sql)"
    

    它似乎没有在查询中正确地传递变量,我不确定出错的地方。

    有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Mutation Person    14 年前

    你看到的具体问题是什么?更多信息会有所帮助。

    我能告诉你的是,你的代码翻译成了一行很长的SQL(用69836代替 bondnumber )

    DECLARE @investor varchar(10), @thepassword varchar(20), @linkedserver2 varchar(25), @sql varchar(1000) SELECT @investor = '69836', @linkedserver2 = 'binfodev', @sql = 'SELECT * FROM ' + @linkedserver2 + ' WHERE bondno = ''@investor'' ' EXEC(@sql)
    

    我敢打赌,如果您在查询窗口中执行该操作,它将失败。尝试添加 ; 在每个逻辑语句的末尾。

    您是否考虑将此代码设为存储过程并向其传递参数?像这样的代码是非常危险的(SQL注入),很难读取,一般来说有点难看。

    示例存储过程代码:

    CREATE PROCEDURE dbo.usp_MyStoredProcedure 
          @Param1 INT = NULL
    AS
    
    SELECT * FROM MyTable Where Col1 = @Param1
    
        2
  •  0
  •   Mike Cheel    14 年前

    @杰米-嗯,我个人倾向于发现,虽然技术上没有必要,但把事情分成一部分要清楚得多。我只是想单独构建参数变量,然后将其作为参数化变量添加(如下所示):

    Dim sql As String = "SELECT * FROM @LinkedServer WHERE bondno = @BondNumber"
    Dim c As New SqlConnection("Your Connection String Here")
    Dim cmd As SqlCommand = c.CreateCommand()
    With cmd
        .CommandType = CommandType.Text
        .CommandText = sql
        .Parameters.Add(New SqlParameter("@LinkedServer", SqlDbType.VarChar)).Value = "binfodev"
        .Parameters.Add(New SqlParameter("@BondNumber", SqlDbType.VarChar)).Value = "69836"
    End With
    Dim dt As New DataTable
    Dim da As New SqlDataAdapter(cmd)
    da.Fill(dt)