无法使Dynamic SQL传递动态表参数

时间:2018-04-04 12:20:23

标签: c# sql sql-server

不要担心SQL注入或类似的东西,只是试图让它工作。使用SSMS和Visual Studio。

我有C#代码将变量GlobalVariables.username传递给SQL参数。

private void btnNext_Click(object sender, EventArgs e)
{
    if (checkIntrotoPublicSpeaking.Checked || checkEffectiveOralCommunication.Checked || checkProfComm.Checked)
    {
        List<SqlParameter> sqlOralComm = new List<SqlParameter>();
        sqlOralComm.Add(new SqlParameter("Username", GlobalVariables.username));
        sqlOralComm.Add(new SqlParameter("IntrotoPublicSpeaking", cboxIntrotoPublicSpeaking.Text));
        sqlOralComm.Add(new SqlParameter("EffectiveOralCommunication", cboxEffectiveOralCommunication.Text));
        sqlOralComm.Add(new SqlParameter("ProfComm", cboxProfComm.Text));
        DAL.ExecSP("CreateOralComm", sqlOralComm);
    }
}

我一直在阅读动态SQL并看到将表名作为参数传递,你必须手动构建它并执行它作为“SET ...”等等。我一直在尝试略有不同修改下面的最后3行。每次,我都会遇到与该行不同部分有关的“无效语法...”异常。在堆栈交换中,它分为3行,但在SSMS中它是一行,更容易阅读。

状态为nvarchar列,Course为int列。

ALTER PROCEDURE [dbo].[CreateOralComm]
-- Add the parameters for the stored procedure here
    @Username nvarchar(30),
    @IntrotoPublicSpeaking nvarchar(3),
    @EffectiveOralCommunication nvarchar(3),
    @ProfComm nvarchar(3)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
    SET NOCOUNT ON;

-- Insert statements for procedure here
    DECLARE @sql as nvarchar(max)
    SET @sql = 'UPDATE ' + @Username + ' SET Grade = ' + 
    @IntrotoPublicSpeaking + ' Status = "Completed" WHERE Course = 7600105';
    EXEC sp_executesql @sql;
END
GO

我知道全局变量有效,我有另一行代码,它只是一个显示值的MessageBox,而且是正确的。只是不能让最后几行SQL工作。我正在尝试第一部分@IntrotoPublicSpeaking,然后再转到另一部分。

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:1)

这里有两件事:

DECLARE @sql as nvarchar(max)
SET @sql = 'UPDATE ' + @Username + ' SET Grade = ' + 
@IntrotoPublicSpeaking + ' Status = "Completed" WHERE Course = 7600105';
EXEC sp_executesql @sql;

在状态之前缺少逗号,我认为您确实需要使用单引号

DECLARE @sql as nvarchar(max)
SET @sql = 'UPDATE ' + @Username + ' SET Grade = ' + 
@IntrotoPublicSpeaking + ', Status = ''Completed'' WHERE Course = 7600105';
EXEC sp_executesql @sql;