0

这是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/

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

+0

串联的结果应该是这样的:'SELECT * from [YourTable] WHERE Users = Some_User_Name' ....看到问题?,'Some_User_Name'应该是''Some_User_Name'' – Lamak

+0

但如果我添加'@User'它不会将@ User作为参数 – WeinForce

+0

并且此代码仍然打开ti sql因为你只是在sproc中使用连接。 –

回答

0

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

SET @query='SELECT * from '+QUOTENAME(@TableName)+' where Users='''[email protected]+'''' 
+0

它确实有效,但我很难理解为什么要使用许多引号。 – WeinForce

+0

''''因为设置'之间'是不可能的,tjere可以选择添加一个,并且sql解释它应该是。 Simillar情况在这里:'''。 – MadOX

-1

查询未正确包含。

SET @query="SELECT * from '+QUOTENAME(@TableName)+' where Users='[email protected]+'" 
+0

将在'c#'中工作,但在'sql'中没有,因为那里没有双引号。 – MadOX

+0

对不起,我应该有单引号。虽然问题是一样的。 –

0

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

DECLARE @ParmDefinition NVARCHAR(2000); 

SET @query='SELECT * from '+QUOTENAME(@TableName)+' where [email protected]'; 
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的第二个和第三个参数