簡體   English   中英

如何將存儲過程的結果放在視圖的新列中?

[英]How do I put the result of stored procedure in a new column in a view?

我創建了一個存儲過程,它將模式名稱和表名稱作為輸入,並輸出一個包含表id列中最大值的 INT。 我還創建了一個視圖,其中包含我的數據庫中的所有模式名稱、表名稱和主鍵列名稱。 我想向此視圖添加一列,其中包含我的存儲過程的結果,使用模式名稱和表名稱值作為行存儲過程的輸入。 我嘗試了一些不同的事情,但我找不到辦法做到這一點。

存儲過程:

CREATE PROCEDURE [dbo].[sp_ttw_max_id]
(
    @schema VARCHAR(50),
    @table VARCHAR(50),
    @max_id INT OUTPUT
) AS
BEGIN
    -- Another custom stored procedure to help sanitize the input
    EXEC sp_ttw_santize @schema, @table, @schema OUTPUT, @table OUTPUT;

    DECLARE @param NVARCHAR(255); 
    SET @param = '@max_id_param INT OUTPUT';

    DECLARE @sql NVARCHAR(255); 
    SET @sql = 'SELECT TOP 1 @max_id_param = [id]
                FROM ' + @table + '
                ORDER BY id DESC;'

    EXEC sp_executesql @sql, @param, @max_id_param = @max_id OUTPUT;
END;

看法:

CREATE VIEW [dbo].[pk_columns] 
AS
    SELECT 
        col_cnst.TABLE_SCHEMA, col_cnst.TABLE_NAME, COLUMN_NAME
    FROM
        INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE col_cnst
    JOIN 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tbl_cnst ON col_cnst.CONSTRAINT_NAME = tbl_cnst.CONSTRAINT_NAME
    WHERE 
        CONSTRAINT_TYPE = 'PRIMARY KEY';

我的嘗試

首先,我嘗試在視圖的SELECT語句@max_id添加到列列表中:

DECLARE @max_id INT;

SELECT col_cnst.TABLE_SCHEMA, col_cnst.TABLE_NAME, COLUMN_NAME, @max_id...

這在我看來是一列空值。 不幸的是,我不知道如何實際分配值。 用我的EXEC語句替換參數名稱沒有幫助。

其次,我嘗試將更改視圖添加到臨時表中,並在我的新列上設置DEFAULT約束,但我遇到了同樣的問題。

第三,我嘗試修改存儲過程以不將最大 ID 作為OUTPUT參數返回。 我在之前的嘗試中用EXEC替換了所有@max_id ,但仍然不好。

這甚至可能嗎?

不能在視圖中包含存儲過程的輸出。

但是,在這種情況下,您似乎可以通過不同的方式獲取相同的數據。 您可以訪問sys.identity_columns的元數據,而不是使用動態 SQL 直接查詢表。

DECLARE @schema nvarchar(128),
    @table nvarchar(128)

SELECT SchemaName = s.name,
         TableName = o.name,
         LastValue = ic.last_value,
         IncrementValue = ic.increment_value
FROM sys.identity_columns AS ic
JOIN sys.objects AS o ON o.object_id = ic.object_id
JOIN sys.schemas AS s ON s.schema_id = o.schema_id
WHERE s.name = @schema
AND o.name = @table;

通過直接查詢元數據,您現在可以通過添加適當的連接或子查詢來將查詢合並到您的視圖中。 此外,它比直接查詢表要快得多。 在您的情況下,如果您只想要所有標識列的列表(假設每個 ID 都是主鍵),則上述查詢(刪除了變量)似乎可以為您提供幾乎想要獲得的輸出。

另請注意,模式和表名稱可以包含 Unicode 字符,最長可達 128 個字符。 您應該確保您的輸入參數支持 Unicode ( Nvarchar ),並且足夠長 (128)。

sys.identity_columns.last_valueMAX(schema.table.id)存在細微差別,即可以使用 ID 值(通過插入),隨后回滾或刪除。 這將導致表中的 ID 值出現間隙,並且當sys.identity_columns.last_valueMAX(schema.table.id)不同步時會反映該間隙。 在任何前瞻性場景中, last_value將是最正確的,但如果您專門回顧以識別“表中當前存在的最高提交值”,則您需要將MAX()計算為 100%確定返回值存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM