【发布时间】:2020-09-04 19:50:42
【问题描述】:
我正在尝试在 SQL Server 中编写一个存储过程,它将:
- 将整数列表作为输入(假设这些整数是“profile_id”)
- 将所有列名为“profile_id”的表名提取到游标中
- 遍历光标并在其与输入参数列表中的其中一个匹配时打印 profile_id 值。
现在的问题是:我正在执行这样的程序:
EXEC dbo.de_dup '1234,2345';
在尝试执行下面注释掉的行时出现语法错误(请参阅过程):
set @id = (select profile_id from @tname where profile_id in @a_profile_id );
问题:
- 在游标内执行和设置值的正确方法是什么?
- (在我们的例子中)将整数列表传递给此过程的方法是什么?
这是我的程序:
ALTER PROCEDURE dbo.de_dup
(@a_profile_id nvarchar(MAX))
AS
DECLARE @tname VARCHAR(max),
@id int;
DECLARE tables_cursor CURSOR FOR
SELECT
a.TABLE_CATALOG +'.'+a.TABLE_SCHEMA + '.'+ a.TABLE_NAME AS table_name
FROM
JobApp.INFORMATION_SCHEMA.COLUMNS a
LEFT OUTER JOIN
JobApp.INFORMATION_SCHEMA.VIEWS b ON a.TABLE_CATALOG = b.TABLE_CATALOG
AND a.TABLE_SCHEMA = b.TABLE_SCHEMA
AND a.TABLE_NAME = b.TABLE_NAME
WHERE
a.COLUMN_NAME = 'profile_id'
GROUP BY
a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME;
OPEN tables_cursor;
FETCH NEXT FROM tables_cursor INTO @tname;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @a_profile_id ;
PRINT @tname ;
--set @id= (select profile_id from @tname where profile_id in @a_profile_id );
--PRINT 'id : ' + @id;
FETCH NEXT FROM tables_cursor INTO @tname;
END;
CLOSE tables_cursor;
DEALLOCATE tables_cursor;
GO;
如果我提供更多说明,请告诉我。提前致谢。
【问题讨论】:
-
第一个问题,为什么要使用光标。
-
这是我提供的最简单的示例,我们将使用光标进行操作。我们将对每个表名做更复杂的事情
-
能否请您发布错误?当你想执行一个表名在一个变量中的查询时,你需要使用动态 SQL 的概念
-
您希望仅打印配置文件 ID?
sql-server版本是什么? -
我们想在查询中使用传入的配置文件 ID:(从 tname 中选择 profile_id,其中 profile_id 在 a_profile_id 中)。 --- 例如:“select profile_id from dao.client where profile_id in (1234,2345)”
标签: sql sql-server stored-procedures database-cursor