Длина строки SQL Server - PullRequest
       7

Длина строки SQL Server

6 голосов
/ 23 октября 2008

Я пытаюсь определить длину строки в байтах таблицы, выполнив следующую хранимую процедуру:

CREATE TABLE #tmp 
(
  [ID] int, 
  Column_name varchar(640), 
  Type varchar(640), 
  Computed varchar(640), 
  Length int, 
  Prec int, 
  Scale int, 
  Nullable varchar(640), 
  TrimTrailingBlanks varchar(640), 
  FixedLenNullInSource varchar(640), 
  Collation varchar(256)
)
INSERT INTO #tmp exec sp_help MyTable
SELECT SUM(Length) FROM #tmp
DROP TABLE #tmp

Проблема в том, что я не знаю определения таблицы (типы данных и т. Д.) Для таблицы, возвращаемой sp_help.

Я получаю следующую ошибку:

Insert Error: Column name or number of supplied values does not match table definition.

Просмотр хранимой процедуры sp_help не дает мне никаких подсказок.

Каков правильный оператор CREATE TABLE для вставки результатов sp_help?

Ответы [ 5 ]

7 голосов
/ 23 октября 2008

Как это сделать вместо этого?

CREATE TABLE tblShowContig
(
    ObjectName CHAR (255),
    ObjectId INT,
    IndexName CHAR (255),
    IndexId INT,
    Lvl INT,
    CountPages INT,
    CountRows INT,
    MinRecSize INT,
    MaxRecSize INT,
    AvgRecSize INT,
    ForRecCount INT,
    Extents INT,
    ExtentSwitches INT,
    AvgFreeBytes INT,
    AvgPageDensity INT,
    ScanDensity DECIMAL,
    BestCount INT,
    ActualCount INT,
    LogicalFrag DECIMAL,
    ExtentFrag DECIMAL
)
GO

INSERT tblShowContig
EXEC ('DBCC SHOWCONTIG WITH TABLERESULTS')
GO

SELECT * from tblShowContig WHERE ObjectName = 'MyTable'
GO
2 голосов
/ 23 октября 2008

Ни один из вышеупомянутых ответов не является правильным или действительным.

Вопрос заключается в определении количества байтов, потребляемых в строке, для каждого типа данных столбца.

Единственные методы, которые у меня есть, это:

  1. exec sp_help 'mytable' - затем добавьте поле длины второго набора результатов (при работе с Query Analyzer или Management Studio - просто скопируйте и вставьте результат в электронную таблицу и выполните SUM)

  2. Напишите программу на C # или VB.NET, которая обращается ко второму набору результатов и суммирует поле длины каждой строки.

  3. Изменить код sp_help.

Этого нельзя сделать с помощью Transact SQL и sp_help, поскольку нет способа работать с несколькими наборами результатов.

FWIW: Табличные определения наборов результатов можно найти здесь:

http://msdn.microsoft.com/en-us/library/aa933429(SQL.80).aspx

2 голосов
/ 23 октября 2008

Попробуйте это:

- сумма всех столбцов

select SUM(sc.length)  
from syscolumns sc  
inner join systypes st on sc.xtype = st.xtype  
where id = object_id('table')

- Посмотрите на различные возвращенные предметы

select st.name, sc.*  
from syscolumns sc  
inner join systypes st on sc.xtype = st.xtype  
where id = object_id('table')  

Хотя нет никаких гарантий, но, похоже, она имеет ту же длину, что и sp_help 'table'

ПРЕДУПРЕЖДЕНИЕ: Обратите внимание, что я прочитал статью, связанную с Джоном Руди, и в дополнение к максимальным размерам здесь вам также понадобятся другие вещи, такие как битовая карта NULL, чтобы получить фактический размер строки. Также размеры здесь - максимальные размеры. Если у вас есть столбец varchar, фактический размер в большинстве строк меньше ....

У Vendoran есть хорошее решение, но я нигде не вижу максимального размера строки (на основе определения таблицы). Я вижу средний размер и все виды информации о распределении, которая является именно тем, что вам нужно для оценки размера БД для большинства вещей.

Если вас интересует только то, что sp_help возвращает для длины и суммирует ее, то я думаю (я не уверен на 100%), что запрос к sysobjects возвращает те же числа. Они представляют полный максимальный размер строки? Нет, вам не хватает таких вещей, как битовый массив NULL. Они представляют собой реальную меру ваших фактических данных? Нет. Опять же, VARCHAR (500) не занимает 500 байт, если вы храните только 100 символов. Кроме того, поля TEXT и другие поля, хранящиеся отдельно от строки, не показывают их фактический размер, только размер указателя.

0 голосов
/ 23 октября 2008

Это даст вам всю необходимую информацию

Select * into #mytables
from INFORMATION_SCHEMA.columns

select * from #mytables

drop table #mytables

UPDATE:

Ответ, который я дал, был неполным НЕ неверен. Если вы посмотрите на возвращенные данные, то поймете, что вы можете написать запрос, используя регистр для вычисления размера строк в байтах. В нем есть все, что вам нужно: тип данных | размер | точность. BOL имеет байты, используемые каждым типом данных. Я отправлю полный ответ, когда у меня будет шанс.

0 голосов
/ 23 октября 2008

Я не могу помочь вам с созданием временной таблицы для хранения информации sp_help, но я могу помочь вам с вычислением длины строк. Проверьте эту статью MSDN ; он помогает вам вычислять такие значения на основе длины поля, типа и т. д. Вероятно, не потребуется слишком много времени для преобразования его в сценарий SQL, который можно использовать повторно, запрашивая sysobjects и т. д.

EDIT:

Я редактирую свое предложение сделать для него сценарий. Мой путь был далеко не таким легким, как у Вендорана. :)

В качестве отступления, я забираю то, что я говорил ранее о невозможности помочь с таблицей температуры. Я могу: Вы не можете сделать это. Процедура sp_help выводит семь наборов строк, поэтому я не думаю, что вы сможете что-то сделать, как описано в первоначальном вопросе. Я думаю, что вы застряли, используя другой метод, чтобы придумать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...