[英]How to write stored procedure to do this?
我想创建一个存储过程,该存储过程接受用逗号分隔的字符串,例如“ 1,2,3,4”,并将其分解并使用这些数字在不同的表上运行查询。
所以在同一个存储过程中,它会做类似的事情
select somefield from sometable where somefield = 1
select somefield from sometable where somefield = 2
select somefield from sometable where somefield = 3
select somefield from sometable where somefield = 4
谢谢!
查阅Erland Sommarskog的出色文章,主题是如何将值列表传递给SQL Server 2005中的存储过程:
由此,您应该能够根据所具有的条件来创建查询。
假设您要执行此操作,请参见http://www.sommarskog.se/arrays-in-sql-2005.html#CSV
select somefield from sometable where somefield in(1,2,3,4)
有一个非常漂亮的例子在这里 。
使用链接中定义的拆分功能,您可以执行此操作。
SELECT *
FROM table
WHERE id in ( SELECT convert(int,Value) FROM dbo.Split(@list_string,',')
或者,您可以使用表值函数split的表形式加入主查询。
如果您想变得复杂,可以将输入字符串转换为临时表/表变量,然后在闲暇时执行一系列IF语句或查询。
SQLServer proc以逗号分隔的输入字符串并将其作为表变量返回。
IF EXISTS(SELECT name FROM sysobjects WHERE name = 'fn_parseString' AND (type = 'TF' OR type = 'IF' OR type = 'FN'))
DROP FUNCTION fn_parseString
GO
/* This function takes a comma delimited string of information and parses it based on commas, returning the resultant strings. */
CREATE FUNCTION fn_parseString
(@StringToParse TEXT)
RETURNS @StringTable TABLE (ParsedString VARCHAR(8000), StringIndex INT)
AS
BEGIN
DECLARE @CurrentString VARCHAR(8000)
DECLARE @CurrentStringIndex INT
DECLARE @TextLength INT
DECLARE @Index INT
DECLARE @Letter VARCHAR(1)
DECLARE @PreviousLetter VARCHAR(1)
SET @CurrentString = ''
SET @CurrentStringIndex = 0
SET @TextLength = DATALENGTH(@StringToParse)
SET @PreviousLetter = ''
SET @Index = 1
WHILE @Index <= @TextLength
BEGIN
SET @Letter = SUBSTRING(@StringToParse, @Index, 1)
IF @Letter = ','
BEGIN
SET @CurrentStringIndex = @CurrentStringIndex + 1
INSERT INTO @StringTable
(ParsedString,
StringIndex)
VALUES (@CurrentString,
@CurrentStringIndex)
IF @@ERROR <> 0
BEGIN
DELETE
FROM @StringTable
RETURN
END
SET @CurrentString = ''
END
ELSE IF @PreviousLetter <> ',' OR (@PreviousLetter = ',' AND @Letter <> ' ') /* Get rid of the spaces inserted when the string was created. */
BEGIN
SET @CurrentString = @CurrentString + @Letter
END
SET @PreviousLetter = @Letter
SET @Index = @Index + 1
END
IF @CurrentString <> ''
BEGIN
SET @CurrentStringIndex = @CurrentStringIndex + 1
INSERT INTO @StringTable
(ParsedString,
StringIndex)
VALUES (@CurrentString,
@CurrentStringIndex)
IF @@ERROR <> 0
BEGIN
DELETE
FROM @StringTable
RETURN
END
END
RETURN
END
在其他地方访问该函数的代码:
DECLARE @CommaDelimitedString VARCHAR(8000)
SET @CommaDelimitedString = '1,2,3,4,5,6,7,8,cow,dog,horse'
DECLARE @StringTable TABLE
(StringValue VARCHAR(8000),
ColumnID INT)
SET NOCOUNT ON
INSERT INTO @StringTable
(StringValue,
ColumnID)
SELECT ParsedString,
StringIndex
FROM dbo.fn_ParseString(@CommaDelimitedString)
IF @@ERROR <> 0
BEGIN
SET NOCOUNT OFF
RAISERROR('An error occurred while parsing the AccountIDs out of the string.',16,1)
END
SELECT * FROM [Sometable] JOIN @StringTable AS tmp ON [sometable.value] = tmp.StringValue
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.