2016-07-17 4 views
-2

У меня есть четыре столбца в таблице Surname, FirstName, MiddleName, CurrAddress. Есть ли способ, чтобы я мог динамически хранить имена столбцов с помощью массива и получать максимальную длину каждого столбца? Скажем, например, из четырех полей мне нужны только максимальные длины Surname и FirstName. Мой код ниже отображает только один столбец за транзакцию. Любая помощь приветствуется. Спасибо!Получите максимальную длину столбца 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_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (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

Пример от Microsoft не работает для меня, но следующий код

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 

Проблема с примером микрософт показалась t o что t1 должен быть полностью квалифицирован в хранимой процедуре.

0

У вас есть нативная функция для этого:

 select COL_LENGTH('TABLENAME', 'COLUMNNAME') 
Смежные вопросы