我有一个像这样的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添加到输入列表中相应名称的临时表中。
请帮忙
答案 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