我需要从c#.net代码中匹配时间戳的表中选择记录2000。 例如:
SELECT *
FROM ITEMDATA_TABLE
WHERE ITEMNAME='Item1' and TimeStamp='2010-04-26 17:15:05.667'
上述查询必须针对相同的时间戳执行更多2000个项目。
为此我们可以使用
SELECT *
FROM ITEMDATA_TABLE
WHERE ITEMNAME in ('Item1','Item2','Item3','Item4',......)
AND TimeStamp='2010-04-26 17:15:05.667'
来自SQL Server Management Studio。
我尝试将所有Item名称附加到一个字符串变量并将其作为参数提供给存储过程,但结果导致了错误的连接。
如何将此作为从.net代码执行的存储过程? 有谁能建议我/纠正我这样做?
答案 0 :(得分:6)
如果您使用的是SQL Server 2008(未提及您的版本),则可以使用table-valued parameters。
如果您使用的是SQL Server 2005或更低版本,请查看Erland Sommarskog的excellent articles,了解如何处理存储过程中的参数列表。
你不能只是将它们作为字符串传递 - 这不起作用。
答案 1 :(得分:1)
如果从存储过程中执行此操作,我将创建一个包含所有有效项目名称的临时表,插入到该表中(即:只是一个表),然后对其进行查询作为主要,加入到主服务器ID / DateTime限定。然后删除临时表。
答案 2 :(得分:1)
以下可能是您要查找的代码:
SET @SQLString = N'SELECT *
FROM table1
WHERE timet = @time and items in (@item)';
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
SET @ParmDefinition = N'@time timestamp,
@item varchar(max) ';
EXECUTE sp_executesql
@SQLString
,@ParmDefinition
,@time = '2010-04-26 17:15:05.667'
,@item = '''Item1'',''Item2'',''Item3'',''Item4'''
;
答案 3 :(得分:0)
不要告诉你以另一种方式做到这一点,但如果您选择了所有带有您正在寻找的时间戳的项目,然后在您的c#代码中迭代此记录集,这会不会更容易?
答案 4 :(得分:0)
在SQL 2005中,您可以将item列表作为XML参数传递给存储过程,然后针对xml参数编写查询。像这样的东西
SELECT ItemData_Table。* FROM ItemData_Table 交叉申请MyxmlParameter.nodes('item')数据(i) WHERE ItemData_Table.ItemId = i.value('@ itemid',INT)
这里MyxmlParameter是您从.NET代码传递给存储过程的XML。