我嘗試用表的第一行重命名列名。(我知道,在 SQL 中“沒有順序的第一行”沒有意義,但我必須為我的測驗這樣做)。因此,我不想動態搜索我的舊列名和新列名以在 while 回圈中執行 sp_rename。這是馬代碼:
DECLARE @i INT;
SET @i = 0;
DECLARE @oldnom NVARCHAR(MAX);
DECLARE @newnom NVARCHAR(MAX)
DECLARE @sSQL NVARCHAR(MAX);
DECLARE @ParmDefinition NVARCHAR(MAX);
DECLARE @tablename NVARCHAR(MAX) ;
SET @tablename = N'Produit_A';
WHILE @i < (SELECT MAX(rownum) FROM (SELECT ROW_NUMBER() OVER(ORDER BY ORDINAL_POSITION ASC) AS rownum,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tablename AND COLUMN_NAME like 'Prop%') truc)
BEGIN
SET @oldnom = 'Prop_' CAST(@i AS NVARCHAR(MAX))
SET @oldnom = 'dbo.' @tablename '.[' @oldnom ']'
SET @i = @i 1
SELECT @sSQL = N'SELECT TOP 1 @retvalOUT = COALESCE(' @oldnom ',''' @oldnom ''') FROM dbo.' @tablename;
SET @ParmDefinition = N'@retvalOUT NVARCHAR(MAX) OUTPUT';
EXEC sp_executesql @sSQL, @ParmDefinition, @retvalOUT=@newnom OUTPUT;
IF @newnom <> @oldnom
BEGIN
SELECT @oldnom, @newnom;
-- EXEC sp_rename @oldnom, @newnom;
END
END
我的請求正常作業,SELECT @oldnom, @newnom; 回傳所有需要重命名的列,并且可以使我的 sp_rename.
但是,當我取消注釋 EXEC sp_rename @oldnom, @newnom; 并執行我的請求。
我的專欄改名得很好,但不是全部。我的 exec 在一定數量后停止而沒有錯誤。
如果我更改了while的開始,以下列也被很好地重命名,所以問題不是由于某個列上的錯誤。
I don't understand why the select work fine but the exec sp_rename stop working after a few times ...
I thought about a limit of executions in a single request but I couldn't find any information about it.
I also thought about the error message returned by the sp_rename command (Caution: Changing any part of an object name could break scripts and stored procedures.), but same, no information.
uj5u.com熱心網友回復:
您沒有向我們提供第一行的列名,所以我們必須盲目。
但是基于它在您不重命名時有效的事實,我敢打賭問題是您在一段時間內的查詢:
@i < select max(rownum) from (.....)truc
請注意,每次迭代后都會評估此查詢。當您不重命名列時,它運行良好,因為每次它回傳相同的東西。
但是,如果您確實重命名了列,那么您將從該查詢中洗掉行,因為:
AND COLUMN_NAME like 'Prop%'
這會導致您的查詢每隔一列“跳轉”。例子:
第一次迭代,row_number=1,列重命名為 [SomeColumn1Title]。
第二次迭代。第一行不再是 [SomeColumn1Title],而是 [SomeColumn2Title]。但是,您位于@i=2,所以將會發生的是第 3 列將被重命名。等等。
這段代碼真的很不穩定。只需使用游標,它只會評估您的查詢一次。
uj5u.com熱心網友回復:
問題出在我的 while 回圈中。我將修復我的代碼并使用游標來避免回圈。非常感謝 !
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/443770.html
