2017-08-11 86 views
-1

我的程序將創建一個臨時表,在程序執行後它將會下降。數據類型長度是8.但是我想在使用Sql Server中的觸發器函數運行程序時將長度更改爲15。我有幾張桌子需要改變長度。有什麼辦法可以改變長度而不用在觸發函數中指定表名?使用觸發器修改列數據類型長度

說明: 我有100個程序將創建不同名稱的臨時表。每個臨時表都將具有user_id varchar(8)。所以我想把長度改爲15。但我不想打開我的每個程序的源代碼來改變它。有沒有更好的方法可以建議我?

+0

您選擇了錯誤的作業工具。這不是觸發器的工作。 –

+0

@Damien_The_Unbeliever你可以建議任何其他方式可以在SQL Server中完成?因爲我不想修改我的程序,因爲我有更多的程序需要更改。 – FullStack

+0

任何你不能簡單地用一次腳本改變表格的理由? – user6144226

回答

1

你想要的東西基本上可以使用DDL觸發器來實現。

CREATE TRIGGER [TRG_TABLES] 
ON DATABASE 
AFTER 
    CREATE_TABLE 
AS 
BEGIN 
    SET NOCOUNT ON 

    DECLARE @TABLE_NAME SYSNAME 

    SELECT 
     @TABLE_NAME = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','SYSNAME') 

    IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME = @TABLE_NAME 
       AND COLUMN_NAME = 'TEST') 
    BEGIN 

     DECLARE @SQL as NVARCHAR(MAX) ='ALTER TABLE ' + @TABLE_NAME + ' ALTER COLUMN TEST NVARCHAR(200) ' 

     Exec sp_ExecuteSql @SQL 
    END 
END 
GO 

ENABLE TRIGGER [TRG_TABLES] ON DATABASE 

如果使用這種方法,你應該EXTRA小心SQL注入。

編輯:這只是一個大概的想法,你應該找出應該在哪些條件下改變列 - 如果表名存在可預測的模式。

+0

非常感謝...這是可行的解決方案。 – FullStack

+0

我還有一個問題。如果我創建一個沒有'TEST'列的表,它會拋出錯誤。我該怎麼做才能擺脫這個錯誤? – FullStack

+0

@FullStack https://stackoverflow.com/questions/133031/how-to-check-if-a-column-exists-in-sql-server-table – user6144226