我創建了一個存盤程序,它將模式名稱和表名稱作為輸入,并輸出一個包含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';
我的嘗試
首先,我嘗試添加@max_id到視圖SELECT陳述句中的列串列:
DECLARE @max_id INT;
SELECT col_cnst.TABLE_SCHEMA, col_cnst.TABLE_NAME, COLUMN_NAME, @max_id...
這在我看來是一列空值。不幸的是,我不知道如何實際分配值。用我的EXEC陳述句替換引數名稱沒有幫助。
其次,我嘗試將更改視圖添加到臨時表中并對DEFAULT我的新列施加約束,但我遇到了同樣的問題。
第三,我嘗試修改存盤程序以不將最大 ID 作為OUTPUT引數回傳。我用@max_ids替換了我之前嘗試中的所有EXECs,但仍然不好。
這甚至可能嗎?
uj5u.com熱心網友回復:
不能在視圖中包含存盤程序的輸出。
但是,在這種情況下,您似乎可以以不同的方式獲取相同的資料。無需使用動態 SQL 直接查詢表,您可以訪問sys.identity_columns.
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_valueand有一個細微的區別MAX(schema.table.id),即可以使用 ID 值(通過插入),然后回滾或洗掉。這將導致在該表中的ID值的間隙,并且間隙被反射時sys.identity_columns.last_value和MAX(schema.table.id)是不同步。在任何前瞻性的情況下,這last_value將是最正確的,但如果您專門回顧以識別“表中當前存在的最高承諾值”,那么您需要計算MAX()100% 確定回傳值存在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323254.html
標籤:sql sql-server 数据库 查询语句 存储过程
上一篇:旋轉但處理列名
下一篇:每個組的第二個最大值-SQL
