SQL Server:使用存储过程中的参数更新动态生成的表中的记录

时间:2015-03-07 04:05:31

标签: sql-server stored-procedures sp-executesql

我必须创建一个存储过程,我将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'

也不确定这是获取数据然后更新数据的最佳方法。

2 个答案:

答案 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()