【发布时间】:2019-03-17 22:03:52
【问题描述】:
我有问题,我无法使用存储过程查看用户信息。该过程接受三个参数:table、column 和 searchBySomething。每次我想使用另一列搜索用户时,列变量接收 id 的列,searchBySomething 变量接收特定的 id,该过程有效,但是当我发送另一列时出现错误留言
无效的列名(数据)
过程如下:
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
【问题讨论】:
-
错误很明显 - 您要搜索的列在您尝试搜索的表中不存在。您为参数传递的确切值是什么?
-
另外,如果您传入的列名中有空格(或其他一些值,例如连字符),您需要分隔列名。对表名和列名使用 QUOTENAME() 函数(这也提高了安全性),并且至少用两个单引号替换 @searchBySomething 中的任何单引号,例如
REPLACE(@searchBySomething, '''', '''''')帮助防止简单的注入攻击。 -
print @sql看看发生了什么。 -
这段代码在各种级别上都很糟糕。阅读 Xedni 的答案并接受它。
-
@squillman 如果实际的列名是
the data,如错误消息所示,那么问题不在于该列不存在。问题是试图解析... WHERE the column = ...。正如 Laughing Virgil 指出的那样,QuoteName至少应该在解析阶段取得更多成功。 (特别向Little Bobby Tables 致敬!)
标签: c# sql-server tsql dynamic-sql