存储过程中的列名无效

Invalid column name on stored procedure

这是我在 SQL Server 2014 中的存储过程:

CREATE PROCEDURE [dbo].[spSelectUserFromProfileUsers]
    @TableName NVARCHAR(20),
    @User NVARCHAR(20)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @query NVARCHAR(MAX);
    SET @query = 'SELECT * FROM ' + QUOTENAME(@TableName) + ' WHERE  Users =' + @User

    EXECUTE sp_executesql @query
END

这是我在 Visual Studio 中的代码:

if (TableFunctions.doesTableExist(ComboBoxSelectedProfile.SelectedItem + "Users", dbConnectionString))
{
    // DynamicSQL
    using (SqlCommand command = new SqlCommand("spSelectUserFromProfileUsers", connection))
    {
        command.CommandType = CommandType.StoredProcedure;

        command.Parameters.AddWithValue("@TableName", ComboBoxSelectedProfile.SelectedItem + "Users");
        command.Parameters.AddWithValue("@User", TextBoxUserName.Text);

        command.ExecuteNonQuery();
    }
}

我收到错误消息:

Invalid column name /Text that I entered the textbox/

我一直在寻找解决方案,但我找不到任何东西,非常感谢你的帮助!

查询未正确包含。

    SET @query="SELECT * from '+QUOTENAME(@TableName)+' where Users='+@User+'"

您需要确保您的 Users 值在引号内。因为它是 sql 并且只有单引号可用,所以您必须以这种奇怪的方式进行。

SET @query='SELECT * from '+QUOTENAME(@TableName)+' where Users='''+@User+''''

您尝试执行动态 sql 的存储过程语法错误。

DECLARE @ParmDefinition NVARCHAR(2000);

SET @query='SELECT * from '+QUOTENAME(@TableName)+' where Users=@User';
SET @ParmDefinition = N'@User NVARCHAR(20)';
EXECUTE sp_executesql @query, @ParmDefinition, @User = @User;

documentation about sp_executesql 中,您可以看到应该按动态 sql 文本中的原样使用参数,而不是尝试提取值并附加值。之后,您应该定义 sp_executesql (@ParmDefinition) 的参数并将其值 (@User = @User) 作为第二个和第三个参数设置为 sp_executesql