我必须创建一个存储过程,我将在其中传递tableName, columnName, id
作为参数。任务是从传递的表中选择columnName
已传递id
的记录。如果找到记录,则使用一些固定数据更新记录。还要实现事务,以便我们可以在出现任何错误时回滚。
数据库中有数百个表,每个表都有不同的模式,这就是为什么我必须传递columnName
。
不知道最好的方法是什么。我正在尝试将记录选择到临时表中,以便我可以根据需要对其进行操作,但它不起作用。
我正在使用以下代码:
ALTER PROCEDURE [dbo].[GetRecordsFromTable]
@tblName nvarchar(128),
@keyCol varchar(100),
@key int = 0
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
--DROP TABLE #TempTable;
DECLARE @sqlQuery nvarchar(4000);
SET @sqlQuery = 'SELECT * FROM ' + @tblName + ' WHERE ' + @keyCol + ' = 2';
PRINT @sqlQuery;
INSERT INTO #TempTable
EXEC sp_executesql @sqlQuery,
N'@keyCol varchar(100), @key int', @keyCol, @key;
SELECT * FROM #TempTable;
END TRY
BEGIN CATCH
EXECUTE [dbo].[uspPrintError];
END CATCH;
END
我收到错误
无效的对象名称"#TempTable"
也不确定这是否是获取数据然后更新数据的最佳方法。
如果您绝对必须完成这项工作,那么我认为您必须使用全局临时表。在运行动态 sql 并进行清理之前,您需要查看它是否存在。使用固定的表名,您会遇到其他连接的问题。在动态 sql 中,您将添加select * into ##temptable from ...
.实际上,我什至不确定您为什么首先想要临时表。动态 sql 不能只返回结果吗?
从表面上看,有一个通用过程来返回带有几个参数的数据来驱动它似乎是一个坚实的想法,但是,如果没有很多解释,它只是不是数据库设计的工作方式。
您应该创建临时表。
IF OBJECT_ID('tempdb..##TempTable') IS NOT NULL
DROP TABLE ##TempTable
CREATE TABLE ##TempTable()