我必须创建一个存储过程,我将tableName, columnName, id
作为参数传递。任务是从columnName
已通过id
的已传递表中选择记录。如果找到记录,则更新包含一些固定数据的记录。还要实现Transaction,以便我们可以在出现任何错误时回滚。
数据库中有数百个表,每个表都有不同的模式,这就是我必须传递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'
也不确定这是获取数据然后更新数据的最佳方法。
答案 0 :(得分:0)
如果你绝对必须做到这一点,那么我认为你将不得不使用全局临时表。在运行动态sql并清理之前,您需要查看它是否存在。使用固定的表名,您将遇到其他连接的问题。在动态sql中你将添加select * into ##temptable from ...
。实际上我甚至不确定为什么你想要临时表。动态sql不能只返回结果吗?
从表面上看,使用一个通用程序来返回带有几个参数的通用程序来驱动它似乎是一个可靠的想法,但是,如果没有很多解释,那就不是数据库设计工作的方式。
答案 1 :(得分:0)
您应该创建临时表。
IF OBJECT_ID('tempdb..##TempTable') IS NOT NULL
DROP TABLE ##TempTable
CREATE TABLE ##TempTable()