执行返回单个值的SQL语句

时间:2015-03-12 09:37:48

标签: sql sql-server sql-server-2008 subquery

我有一个像这样的SQL select语句:

 SET @list = 'TEST,TEST1'
 SET @Delimiter = ',';
 SET @list =  @list + @Delimiter;

 SET @listIndexTemp = CHARINDEX(',',@list);  
 WHILE(@listIndexTemp > 0)
 BEGIN
    SET @listTemp = SUBSTRING(@list, 1,  @listIndexTemp -1);
    DECLARE @string VARCHAR(MAX)

    SET @string = 'SET @listTempUid = SELECT id FROM ['+CAST(@database as varchar(50))+'].[dbo].[MAIN] WHERE [name] = '''+CAST(@listTemp as varchar(100))+'''';
    EXEC (@string);

    INSERT INTO #Roles (uid, name) VALUES(@listTempUid, @listTemp);

    SET @list = SUBSTRING(@list, @listIndexTemp+1,  LEN(@list));
    SET @listIndexTemp = CHARINDEX(',',@list);

 END

对于我的情况,上面的查询是循环的。因此,我必须将上述查询语句'string'的返回值分配给每个迭代的SQL变量'listTempUid'。

以上查询无效。我必须将id和name添加到输入列表中相应名称的临时表中。

请帮忙

1 个答案:

答案 0 :(得分:0)

可以使用EXECUTE SP_EXECUTESQL代替EXEC来实现。要使用SP_EXECUTESQL,您需要声明@string as NVACHAR。在动态查询中,您必须使用SELECT而不是SET语句来指定值。要从动态查询中获取价值,您必须使用OUT参数。

尝试这样的事情。

 SET @list = 'TEST,TEST1'
 SET @Delimiter = ',';
 SET @list =  @list + @Delimiter;

 SET @listIndexTemp = CHARINDEX(',',@list);
 WHILE(@listIndexTemp > 0)
 BEGIN
    SET @listTemp = SUBSTRING(@list, 1,  @listIndexTemp -1);

    DECLARE @string NVARCHAR(MAX)

        SET @string = 'SELECT @TempID = id FROM ['+CAST(@database as
           varchar(50))+'].[dbo].[MAIN] WHERE [name] = '''+CAST(@listTemp as
           varchar(100))+'''';

            EXECUTE SP_EXECUTESQL @string, N'@TempID INT OUT', @listTempUid OUT

    INSERT INTO #Roles (uid, role) VALUES(@listTempUid, @listTemp);

    SET @list = SUBSTRING(@list, @listIndexTemp+1,  LEN(@list));
    SET @listIndexTemp = CHARINDEX(',',@list);

 END