2010-10-22 55 views
1

我有一個存儲過程,由數據收集系統調用。使用動態SQL訪問存儲過程參數

該過程有許多參數用於收集數據。

我使用INFORMATION_SCHEMA參數列表拉到一個臨時表

 
    SELECT substring(PARAMETER_NAME , 2 , len(PARAMETER_NAME) - 1) 'SpParam', PARAMETER_NAME, DATA_TYPE 
    INTO #tempParam 
    FROM INFORMATION_SCHEMA.PARAMETERS 
    WHERE SPECIFIC_NAME='InsertB2ChamberData' 

從那裏我可以插入我的標籤列表表

 
    INSERT INTO ToolTag 
    SELECT @ToolID, @ToolTagTypeID, SpParam, 'Default Description', GETDATE() 
    FROM #tempParam 
    WHERE spParam NOT IN (SELECT ToolTagName FROM ToolTag WHERE ToolID = @ToolID) 

任何丟失的數據的標籤名稱到目前爲止這麼好,現在我想使用ToolTag和臨時表列表來插入每個參數的數據。最初我通過一些動態SQL可以做到這一點。

 
    DECLARE tag CURSOR FOR 
    SELECT t.ToolTagID, p.PARAMETER_NAME, p.DATA_TYPE 
    FROM ToolTag t 
     JOIN #tempParam p 
      ON t.ToolTagName = p.SpParam 

    OPEN tag 

    FETCH NEXT FROM tag INTO @TagID, @Parameter, @DataType 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     SELECT @Cindex = CHARINDEX('char', @DataType) 
     IF @Cindex 0 
     begin 

      SELECT @sql = 
      N'INSERT INTO ToolTagData VALUES('+convert(varchar(10),@TagID)+', '+convert(varchar(10),@ToolDataEventID)+', '+ @Parameter +', 0)' 
     end 
     else 
     begin 
      SELECT @sql = 
      N'INSERT INTO ToolTagData VALUES('+convert(varchar(10),@TagID)+', '+convert(varchar(10),@ToolDataEventID)+', CONVERT(varchar(255),'[email protected] +'), '+convert(varchar(50),@Parameter)+')' 

     end 

     EXEC(@sql) 

     FETCH NEXT FROM tag INTO @TagID, @Parameter, @DataType 
    END 

    CLOSE tag 
    DEALLOCATE tag 

當然以上不作爲@sql聲明的工作結束了這樣的事情:

INSERT INTO ToolTagData VALUES(315,50,@ShutterPosition,0)

由於與@ShutterPosition參數值相反。我被困在這裏,我可以對每個名字進行某種強制性的操作,但是我希望能夠抽象並且對其他程序具有可重用性。

那麼有沒有什麼出路,或者我用這種方法吠叫錯誤的樹?

編輯: 我的模式是這樣的: alt text

的目標是插入一條記錄到ToolTagData數據爲每個存儲過程的參數。 ToolTag的關鍵是存儲過程參數的名稱。

希望通過向過程添加新參數將標籤添加到ToolTag表中。

我受限於第三方數據採集程序能做什麼,所以這次嘗試抽象了這個過程。

+0

你在吠叫錯誤的樹。給我們一些關於你的功能意圖的信息,你會得到一些更好的建議。 – Tahbaza 2010-10-22 23:11:44

+0

這裏有一些更多的細節 – dverespey 2010-10-22 23:30:16

回答

0

最終我決定使用CLR存儲過程來實現這一點:

var tags = new 
              { 
                @Tag1, 
                @Tag2, 
                ... 
                @LastTag}; 

      using (var conn = 
         new SqlConnection("context connection = true")) 
      { 
         conn.Open(); 
         var cmd = new SqlCommand 
                { 
                  Connection = conn, 
                  CommandText = 
                    "INSERT INTO TagGroupData SELECT TagGroupID , GETDATE() FROM TagGroup WHERE TagGroupName = 'L1Data' SELECT SCOPE_IDENTITY()" 
                }; 

         var tagGroupDataId = cmd.ExecuteScalar(); 

         cmd.CommandText = ""; 


         cmd.Parameters.Add("@Data", SqlDbType.Float); 
         cmd.Parameters.Add("@Name", SqlDbType.VarChar, 100); 
         cmd.Parameters.Add("@tg", SqlDbType.Int); 

         cmd.Parameters[2].Value = tagGroupDataId; 

         cmd.CommandText = 
           "INSERT INTO ToolTagData SELECT t.ToolTagID, CONVERT(varchar(255),@Data), @Data, @tg, GETDATE() FROM ToolTag t WHERE t.ToolTagName = @Name"; 

         foreach (PropertyInfo pi in tags.GetType().GetProperties()) 
         { 
           cmd.Parameters[1].Value = pi.Name; 
           cmd.Parameters[0].Value = pi.GetValue(tags, null); 

           cmd.ExecuteScalar(); 
         } 
1

相反的EXEC,使用sp_ExecuteSQL

然後,你可以做這樣的事情:

DECLARE 
    @sql nvarchar(max), 
    @ParamDef nvarchar(1000) 


SET @ParamDef = N'@param1 int, 
    @param2 int' 

EXECUTE dbo.sp_ExecuteSQL @sql, @ParamDef, 
    @param1 = @param1, 
    @param2 = @param2