2016-07-17 70 views
-2

我在表Surname,FirstName,MiddleName, CurrAddress中有四列。有沒有一種方法可以使用數組動態地存儲列名並獲取每列的最大長度?舉例來說,在四個字段中,我只需要最大長度爲SurnameFirstName。我的下面的代碼將只顯示每個事務一列。任何幫助是極大的讚賞。謝謝!使用數組獲取SQL Server列的最大長度

ALTER PROCEDURE [dbo].[sp_getColumnLength] 
    @colval nvarchar(50), 
    @tblval nvarchar(50) 
AS 
BEGIN 
    SELECT 
     character_maximum_length as 'Max Length' 
    FROM 
     information_schema.columns 
    WHERE 
     column_name = @colval 
     AND table_name = @tblval 
END 
GO 
+0

如果您使用'column_name = @ colval'過濾,那麼它將爲每個事務返回一列。你真的想獲得表格的最大長度字段嗎? – Arulkumar

+1

備註:您應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並使用別的東西作爲前綴 - 或者根本沒有前綴! –

回答

0

你可以代替陣列的使用表值參數見https://msdn.microsoft.com/en-gb/library/bb510489(v=sql.110).aspx

微軟實例並沒有爲我工作,但下面的代碼是

USE AdventureWorksdw2012; 
GO 

/* Create a table type. */ 
drop type t1 
go 
CREATE TYPE t1 AS TABLE 
(tabname CHAR(50) 
, colname char(50)); 
GO 

/* Create a procedure to receive data for the table-valued parameter. */ 
CREATE PROCEDURE dbo. usp_InsertProductionLocation 
    @TVP [db_datareader].[t1] readonly 
    AS 

BEGIN 
    SELECT 
     character_maximum_length as 'Max Length' 
    FROM 
     @TVP 
    join information_schema.columns on table_name = tabname and column_name = colname 

END 
GO 

/* Declare a variable that references the type. */ 
DECLARE @TVP AS t1; 

/* Add data to the table variable. */ 
insert into @TVP values ('dimcustomer','title'),('dimcustomer','firstname') 

/* Pass the table variable data to a stored procedure. */ 
EXEC usp_InsertProductionLocation @TVP; 
GO 

微軟的例子似乎有問題o是否需要在存儲過程中完全限定t1。

0

您對此有一個本地函數:

 select COL_LENGTH('TABLENAME', 'COLUMNNAME')