C# @searchBySomething中的单引号加上两个单引号,例如REPLACE(@searchBySomething,“,”),以帮助防止简单的注入攻击。print@sql以查看发生了什么。这种代码在各种级别上都很糟糕。阅读Xedni的答案并接受它。@s

C# @searchBySomething中的单引号加上两个单引号,例如REPLACE(@searchBySomething,“,”),以帮助防止简单的注入攻击。print@sql以查看发生了什么。这种代码在各种级别上都很糟糕。阅读Xedni的答案并接受它。@s,c#,sql-server,tsql,dynamic-sql,C#,Sql Server,Tsql,Dynamic Sql,@searchBySomething中的单引号加上两个单引号,例如REPLACE(@searchBySomething,“,”),以帮助防止简单的注入攻击。print@sql以查看发生了什么。这种代码在各种级别上都很糟糕。阅读Xedni的答案并接受它。@squillman如果实际的列名是数据,如错误消息所示,那么问题不是该列不存在。问题是试图解析。。。其中列=…。正如维吉尔所指出的,QuoteName至少应该允许在解析阶段取得更多的成功。(还有一个特别的呼喊声!)嗨,谢谢,我复制了代码,但仍然是


@searchBySomething中的单引号加上两个单引号,例如
REPLACE(@searchBySomething,“,”)
,以帮助防止简单的注入攻击。
print@sql
以查看发生了什么。这种代码在各种级别上都很糟糕。阅读Xedni的答案并接受它。@squillman如果实际的列名是数据,如错误消息所示,那么问题不是该列不存在。问题是试图解析
。。。其中列=…
。正如维吉尔所指出的,
QuoteName
至少应该允许在解析阶段取得更多的成功。(还有一个特别的呼喊声!)嗨,谢谢,我复制了代码,但仍然是同一个错误,因为我显式地抛出了一个。如果传递的是无效列if not error,您希望它做什么?恕我直言,这个错误是合法的,这只是说明了为什么,以及如果您选择的话,您可以如何检查它是否有不同的行为。这只是一个很好答案的旁注-我知道这来自OP的原始代码-
@表
@列
应该是类型,而不是
nvarchar(30)
。您好,谢谢。我复制了代码,但仍然是同一个错误,因为我显式地抛出了一个错误。如果传递的是无效列if not error,您希望它做什么?恕我直言,这个错误是合法的,这只是说明了为什么,以及如果你选择的话,你可以如何检查它的不同行为。这只是一个很好答案的旁注-我知道这来自OP的原始代码-
@table
@column
应该是类型,而不是
nvarchar(30)
ALTER PROCEDURE [dbo].[userDetailsDisplay] 
    @table NVARCHAR(30),
    @column NVARCHAR(30),
    @searchBySomething NVARCHAR(30)

    DECLARE @sql NVARCHAR(100)

    SET @sql = 'SELECT * FROM ' + @table + ' WHERE ' + @column + ' = ' + @searchBySomething 
    EXECUTE sp_executesql @sql
if not exists
(
    select 1
    from sys.columns
    where object_id = object_id(@table)
        and name = @column
)
begin
    raiserror('Column %s does not exist in table %t', 16, 1, @column, @table)
    return
end
create procedure [dbo].[userDetailsDisplay] 
    @table nvarchar(30),
    @column nvarchar(30),
    @searchBySomething nvarchar(30)
as
begin
    declare 
        @sql nvarchar(max),
        @params nvarchar(1000)

    if not exists
    (
        select 1
        from sys.columns
        where object_id = object_id(@table)
            and name = @column
    )
    begin
        raiserror('Column %s does not exist in table %t', 16, 1, @column, @table)
        return
    end

    select @sql = '
        select * 
        from ' + quotename(@table) + ' WHERE ' + quotename(@column) + ' = @searchBySomething'

    execute sp_executesql 
        @stmt = @sql,
        @params = '@searchBySomething nvarchar(30)',
        @searchBySomething = @searchBySomething
end