2009-02-05 149 views
3

[更新:使用SQL Server 2005]动态SQL逗号分隔值查询

嗨,我想要做的就是询问我有一个逗号分隔值(IDS)列表存储过程来检索数据行。

我收到的问题是转换错误:

Conversion failed when converting the varchar value ' + 
@PassedInIDs + ' to data type int. 

该声明在我的where子句和错误是:

... 
AND (database.ID IN (' + @PassedInIDs + ')) 

注:database.ID为int类型。

我下面的文章在:

http://www.sql-server-helper.com/functions/comma-delimited-to-table.aspx

,但没有因为错误的不完整。

在我执行的脚本我有:

... 
@PassedInIDs= '1,5' 

我错了在这里做什么? 谢谢你的帮助。

+0

您使用的是什么SQL?它不应该试图将该值转换为int。你能展示更多的代码吗? – user54650 2009-02-05 17:58:32

+0

SQL Server 2005?不用说,那应该是有效的。 错误看起来像是将'+ @PassedInIDs +'当作字符串处理......您是否缺少报价? – user54650 2009-02-05 18:02:59

+0

报价应该在哪里? – 2009-02-05 18:04:36

回答

0

您需要将ufn_CSVToTable视为一张表。所以你可以加入这个函数:

JOIN ufn_CSVToTable(@PassedInIDs) uf ON database.ID = uf.[String] 
0

我建议在SQL 2005中使用这个XML。有点笨重,但它可以更容易。它允许你选择XML到一个表格中,然后可以连接或插入等。

看看Sql Server的OPENXML()如果你还没有。

例如,您可以传递这样的: '12 ...”

,然后使用:

exec sp_xml_preparedocument @doc OUTPUT, @xmlParam 

SELECT element 
FROM OPENXML (@doc, 'Array/Value', 2) WITH (element varchar(max) 'text()') 

这应该是一个开始

1

我会强烈建议你使用该链接的第二种方法。创建一个用户定义的函数,将逗号分隔的字符串转换为表格,然后您可以轻松地进行选择。

如果你在Erland和“Dynamic SQL”上使用Google,他对它所带来的缺陷有了很好的说明。

1

其中之一,你传递一个字符串到SQL中的IN函数。如果您回头看原始文章,您会看到,不是发出直接的SQL语句,而是建立一个string这是要执行的SQL语句。

0

SQL中没有字符串评估。这:

database.ID IN (' + @PassedInIDs + ') 

不会转向:

database.ID IN (1,2,3) 

只是因为@PassedInIDs参数恰好包含'1,2,3'。该参数甚至没有看,因为你拥有的是字符串包含" + @PassedInIDs + "。在语法上,这相当于:

database.ID IN ('Bob') 

要长话短说,你不能做你的SQL试图在这里。但也有其他四种可能性:

  1. 您构建在调用语言SQL字符串,并完全放弃存储过程
  2. 您使用的是动态准备的语句与IN子句中的许多参数在平移使用
  3. 您使用,也就是说,10个参数固定的预处理语句
  4. IN (?,?,?,?,?,?,?,?,?,?),填补只因为你需要尽可能多的,设置别人为NULL
  5. 您创建,比方说,10个参数的存储过程,并通过尽可能多根据需要将其他设置为NULL:IN (@p1, @p2, ..., @p10)
0

这可通过6种方法在纳拉亚纳的文章Passing a list/array to an SQL Server stored procedure

而且我最两岸提出具体的实施中提到要解决的问题是

declare @statement nvarchar(256)
set @statement = 'select * from Persons where Persons.id in ('+ @PassedInIDs +')'
exec sp_executesql @statement

    -
0

以下是我已经找到并测试:

SET QUOTED_IDENTIFIER ON 
SET ANSI_NULLS ON 
GO 
CREATE FUNCTION [dbo].[SplitStrings] (@IDsList VARCHAR(MAX)) 
RETURNS @IDsTable TABLE ([ID] VARCHAR(MAX)) 
AS 
BEGIN 
    DECLARE @ID VARCHAR(MAX) 
    DECLARE @Pos VARCHAR(MAX) 

    SET @IDsList = LTRIM(RTRIM(@IDsList)) + ',' 
    SET @Pos = CHARINDEX(',', @IDsList, 1) 

    IF REPLACE(@IDsList, ',', '') <> '' 
     BEGIN 
      WHILE @Pos > 0 
       BEGIN 
        SET @ID = LTRIM(RTRIM(LEFT(@IDsList, @Pos - 1))) 
        IF @ID <> '' 
         BEGIN 
          INSERT INTO @IDsTable 
            ([ID]) 
          VALUES (CAST(@ID AS VARCHAR)) 
         END 
        SET @IDsList = RIGHT(@IDsList, LEN(@IDsList) - @Pos) 
        SET @Pos = CHARINDEX(',', @IDsList, 1) 
       END 
     END 
    RETURN 
END 

GO 

以下是函数调用方法:

SELECT * FROM dbo.SplitStrings('123,548,198,547,965')