2013-12-11 115 views
1

我正在嘗試創建一個可以調用的函數來檢查哪個數據庫中每個表的鍵的下一個ID。我弄清楚如何去做,但是我不能創建這個函數,因爲我得到這個錯誤:SQL Server:在函數中使用Exec的替代方法

「無效的函數內使用副作用運算符'INSERT EXEC'」。

看來我不能在函數中使用Exec。我可以選擇哪些替代方案來獲取這些信息?

這是我的代碼:

CREATE FUNCTION FCN_ProximoID() 
RETURNS @TablaID Table (Tabla nvarchar(370), ID int) 
AS 
BEGIN 
-- Fill the table variable with the rows for your result set 
DECLARE @Row INT 
DECLARE @Filas INT 
DECLARE @MaxID INT 
DECLARE @Query As varchar(max) 
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128) 



SET @Filas = (SELECT MAX(Fila) 
    FROM (
     SELECT ROW_NUMBER() OVER(ORDER BY A.TABLE_NAME) AS 'Fila', 
          A.TABLE_NAME As Tabla, A.COLUMN_NAME As Columna, 
     A.ORDINAL_POSITION As Indice, B.DATA_TYPE As TipoDato 
     FROM 
     INFORMATION_SCHEMA.KEY_COLUMN_USAGE A 
     LEFT JOIN INFORMATION_SCHEMA.COLUMNS B 
     ON A.COLUMN_NAME = B.COLUMN_NAME AND A.TABLE_NAME=B.TABLE_NAME 
     WHERE LEFT(A.TABLE_NAME,3)='EXT' AND OBJECTPROPERTY(OBJECT_ID 
          (constraint_name), 'IsPrimaryKey')=1 AND B.DATA_TYPE='int' 
     ) As Tablas) 

SET @Row = 1 

WHILE (@Row <= @Filas) 
    BEGIN 
    BEGIN 

    SET @TableName = (SELECT Tabla 
     FROM (
      SELECT ROW_NUMBER() OVER(ORDER BY A.TABLE_NAME) AS 'Fila', 
            A.TABLE_NAME As Tabla, A.COLUMN_NAME As Columna, 
            A.ORDINAL_POSITION As Indice, B.DATA_TYPE As TipoDato 
      FROM 
      INFORMATION_SCHEMA.KEY_COLUMN_USAGE A 
      LEFT JOIN INFORMATION_SCHEMA.COLUMNS B 
      ON A.COLUMN_NAME = B.COLUMN_NAME AND 
            A.TABLE_NAME=B.TABLE_NAME 
      WHERE LEFT(A.TABLE_NAME,3)='EXT' AND OBJECTPROPERTY(OBJECT_ID 
            (constraint_name), 'IsPrimaryKey')=1 AND B.DATA_TYPE='int' 
      ) As Tablas WHERE [email protected]) 

    SET @ColumnName = (SELECT Columna 
     FROM (
      SELECT ROW_NUMBER() OVER(ORDER BY A.TABLE_NAME) AS 'Fila', 
            A.TABLE_NAME As Tabla, A.COLUMN_NAME As Columna, 
      A.ORDINAL_POSITION As Indice, B.DATA_TYPE As TipoDato 
      FROM 
      INFORMATION_SCHEMA.KEY_COLUMN_USAGE A 
       LEFT JOIN INFORMATION_SCHEMA.COLUMNS B 
       ON A.COLUMN_NAME = B.COLUMN_NAME AND 
               A.TABLE_NAME=B.TABLE_NAME 
       WHERE LEFT(A.TABLE_NAME,3)='EXT' AND 
               OBJECTPROPERTY(OBJECT_ID 
               (constraint_name), 'IsPrimaryKey')=1 
               AND B.DATA_TYPE='int' 
      ) As Tablas WHERE [email protected]) 


INSERT INTO @TablaID 

EXEC('SELECT ''' + @TableName + ''', ISNULL(MAX(' + @ColumnName + '),0)+1 FROM ' + @TableName) 



SET @Row = @Row + 1 


END 
END 


RETURN 
END 
GO 
+0

嘗試使您的ID列成爲[IDENTITY COLUMN](http://msdn.microsoft.com/zh-cn/library/ms186775.aspx),並使用[SCOPE_IDENTITY()](http)獲取最後插入的行ID ://technet.microsoft.com/en-us/library/ms190315.aspx)。 – user2989408

回答

1

Exec的不是在功能允許的,但它允許在存儲過程中,所以你可以重寫功能作爲retuns一個結果的存儲過程。

+0

謝謝,但我需要在select語句中使用此結果。我可以在select語句中使用存儲過程嗎? – MariPlaza

+0

您可以運行INSERT INTO MyTable EXEC MyStoredProcedure,然後在SELECT語句中使用MyTable,但不直接在SELECT語句中引用MyStoredProcedure。 MyTable可以是一箇中介臨時表。 –

相關問題