Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用用户提供的数据连接查询-T-sql_Sql Server_Tsql - Fatal编程技术网

Sql server 使用用户提供的数据连接查询-T-sql

Sql server 使用用户提供的数据连接查询-T-sql,sql-server,tsql,Sql Server,Tsql,我有一个要求,用户将在vb.net应用程序的文本区域中提供许多ID(以百分之几/千为单位),我需要在T-Sql(Sql Server)中使用这些ID来获取数据。我不想将这些ID保存在任何数据库表中。只需要使用paramater(varchar(max)类型)传递并在过程中使用 实际上,vb应用程序用户只允许读访问。它是Sql-2005数据库。Id字段的长度为12到15个字符。用户将从其他来源复制/粘贴数据,可能是CSV或Excel文件 你知道我怎样才能做到吗 感谢您的帮助 谢谢如果您不想使用其他

我有一个要求,用户将在vb.net应用程序的文本区域中提供许多ID(以百分之几/千为单位),我需要在T-Sql(Sql Server)中使用这些ID来获取数据。我不想将这些ID保存在任何数据库表中。只需要使用paramater(varchar(max)类型)传递并在过程中使用


实际上,vb应用程序用户只允许读访问。它是Sql-2005数据库。Id字段的长度为12到15个字符。用户将从其他来源复制/粘贴数据,可能是CSV或Excel文件

你知道我怎样才能做到吗

感谢您的帮助


谢谢

如果您不想使用其他地方建议的表值参数,并且不想将ID存储在临时表中,可以执行以下操作

假设您的ID是整数值,在参数字符串中用逗号分隔,您可以在SQL语句的WHERE筛选器中使用LIKE运算符:

假设您有一个varchar(max)类型的参数,
@IDs
。您只想从MyTable中获取ID列包含已键入@IDs参数的值的记录。那么您的查询应该如下所示:

SELECT * FROM MyTable
WHERE ',' + @IDs + ',' LIKE '%,' + CAST(ID AS varchar) + ',%'

注意我是如何在@IDs参数前面加上一个逗号的。这是为了确保LIKE运算符仍能按预期为字符串中的第一个和最后一个ID工作。确保对SQL注入采取必要的预防措施,例如验证用户只允许输入整数和逗号。

尝试使用
CHARINDEX

DECLARE @selectedIDs varchar(max) = '1,2,3'
Set @selectedIDs = ',' + @selectedIds + ',' --string should always start and end with ','

SELECT * FROM YourTable
WHERE CHARINDEX(',' + CAST(IDColumn as VARCHAR(10)) + ',', @selectedIds) > 0

什么版本的SQL Server?如果2008+查看表值参数。如果您使用Sql 2008或更高版本,我建议使用-这将允许您建立一组包含ID的行,然后您可以将其加入到
过程中,而无需在早期版本中验证Sql注入攻击、转义引号等,您也可以以类似的方式滥用Xml数据类型。您确定这一要求吗?客户是否真的说过‘我想激怒我的用户,直到他们罢工’?用户真的要一个接一个地输入值吗?可能这些选择已经存储在某个地方,例如可以在服务器上处理的表或CSV文件(例如使用SSI)。将值作为文本传递将非常缓慢,使您面临sql注入攻击,并在有效时生成次优结果。如果您有那么多Id,即使是TVP也可能不够,您将不得不使用表。实际上,vb应用程序用户只允许读访问。它是Sql-2005数据库。Id字段长度至少为12到15个字符。用户将从其他源复制/粘贴数据,可能是CSV或Excel文件。不要。将文件导入服务器中的表(例如使用SSIS),然后进行连接。或者向客户解释,当您以非常缓慢的方式批量执行查询时,他们将不得不等待