2017-05-03 59 views
0

我在修改模式下具有如下的存儲過程。我需要動態傳遞tablename,甚至字符串連接也沒問題。但是,因爲我不太熟悉存儲過程,所以沒有找到辦法做到這一點。任何指導都會有所幫助。 testdata是表名。我需要動態傳遞@TableName。在存儲過程中動態添加表名

USE [test1] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[TestDataTest] 

@TicketId VARCHAR(12), 
@TesterId int, 
    @ValidatorId varchar(10), 
@count int, 
    @TableName varchar(20), 
@ReturnVal int output 



AS 
BEGIN 
SET NOCOUNT ON; 
DECLARE @ReserveStatus char(1),@ret int, @index int,@rs CHAR,@secindex INT,@value INT,@SQL nvarchar(500),@SQL1 nvarchar(500) 
    BEGIN TRAN 
    INSERT INTO TblStatus (TicketId,TesterId,ValidatorId) 
    VALUES 
    (@TicketId,@TesterId,@Validator) 

    IF (@@ERROR<>0) 
     BEGIN 
     ROLLBACK TRAN 
     SET @ReturnVal=2 


     Return @ReturnVal 
     END 

    WHILE @count >0 

     BEGIN 

     SELECT @index=CHARINDEX(' ', @TestDataIdstring,0) 
     SELECT @secindex=CHARINDEX(' ', @TestDataIdstring,(CHARINDEX(' ', @TestDataIdstring,0))+1) 
     SELECT @[email protected]@index 
     SELECT @value 
     select @SQL1 = N'Select ReserveStatus from ' + QUOTENAME(@TableName) + ' where TestDataId= rtrim(Ltrim(SUBSTRING(''' + @TestDataIdstring + ''',' + @index +',' + @value + ')))' 
     execute sp_executesql @SQL1 , N'@RS int OUTPUT', @RS = @RS output; 


     IF (@rs='N') 
     BEGIN 

    Set @SQL = N'Update ' + QUOTENAME(@Tablename) + ' set ReserveStatus=''Y'',TicketId=' + @TicketId + ' where TestDataId= rtrim(Ltrim(SUBSTRING(''' + @TestDataIdstring + ''',' + @index +',' + @value + ')))' 
    Execute sp_executesql @SQL 
     IF (@@ERROR<>0) 
      BEGIN 
      ROLLBACK TRAN 
      SET @ReturnVal=2 
      Return @ReturnVal 
      END 




COMMIT TRAN 

    SET @ReturnVal=3 
    return @SQL 
    return @returnval 

    END 
+0

我認爲動態查詢將有所幫助。 –

+0

我不知道改變這個SP。所以尋求幫助。 – user3660473

+0

無論何時您必須將表名稱傳遞給過程,它都應該是一個紅旗,可能會有更好的數據設計可供您使用。 –

回答

2

您可以使用sp_ExecuteSQL命令。下面是一個簡單的例子,它將表格名稱作爲參數。

Create Procedure dbo.DynamicSQL 
(
    @Tablename nvarchar(50) 
) 
As 

Declare @SQL nvarchar(500) 

Set @SQL = N'Select * from dbo.' + QUOTENAME(@Tablename) 

EXECUTE sp_executesql @SQL 

go 

下面是我在構建您的更新SQL你嘗試,並隨後通過sp_executesql的

申報@SQL爲nvarchar(500)

Set @SQL = N'Update ' + QUOTENAME(@Tablename) + ' set ReserveStatus=''Y'',TicketId=' + @TicketId + ' where TestDataId= rtrim(Ltrim(SUBSTRING(''' + @TestDataIdstring + ''',' + @index +',' + @value + ')))' 
Execute sp_executesql @SQL 

我假設變量執行它傳入的都是變種!

要獲得價值@RS這也是動態的,你需要添加這個。

select @SQL = N'Select ReserveStatus from ' + QUOTENAME(@TableName) + ' where TestDataId= rtrim(Ltrim(SUBSTRING(''' + @TestDataIdstring + ''',' + @index +',' + @value + ')))' 
    execute sp_executesql @SQL , N'@RS char(1) OUTPUT', @RS = @RS output; 
+1

如果你在QUOTENAME中包裝@Tablename,它將有助於防止sql注入。 –

+0

我已經看到所有這些例子..但我不能在我的存儲過程中使用它們 – user3660473

+0

@SeanLange - 噢好吧...聽起來不錯。我以前沒有真正使用過報價名稱!謝謝! – Wheels73