Проверить, существует ли столбец SQL Server без использования схемы?

Сторонняя БД, которую мы читаем в ADO.Net, недавно добавила столбец в новую версию своего кода. Ключ к новому столу.

У нас есть доступ только для чтения к таблицам данных, поэтому в теории не может полагаться на схему для этого. Так...

1) доступен ли INFORMATION_SCHEMA всегда для элементов, к которым вы можете получить доступ, или возможно, у нас не будет прав даже на таблицы, которые мы можем читать?

2) если (1) «плохо», каким будет каноническое решение? В самом SQL я бы сделал SELECT * FROM x WHERE 1=0, а затем протестировал заголовки, есть ли эквивалентный тест в .Net?

Информационная схема кажется, вероятно, лучшим выходом. Да, возможно, у вас не будет доступа, в зависимости от разрешений вашего пользователя.

Tim Biegeleisen 08.01.2019 16:39

Я очень не решаюсь использовать схему в этом случае.

Maury Markowitz 08.01.2019 16:45
is it possible we will not have rights even to tables we can read? - да.
GSerg 08.01.2019 16:49

мы используем SELECT TOP (0) * from (ваш оператор select идет туда) a. для проверки всех ссылок. Основное отличие вашего подхода (1 = 0) заключается в том, что в моей версии вы можете добавить ORDER BY во внутренний запрос. Возможно, вам это не понадобится, так как нам нужно было проверить весь запрос, который может иметь любую форму, а не только один столбец.

Dmitrij Kultasev 08.01.2019 17:32

Хорошее замечание, Дмитрий, так и сделаю в будущем.

Maury Markowitz 08.01.2019 21:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете перечислить имена столбцов (значения не являются обязательными) из любой таблицы или запроса с помощью небольшого XML.

Пример

Declare @AnyTableOrQuery Table (EmpID int,EmpName varchar(50),Salary int,Location varchar(100))
Insert Into @AnyTableOrQuery Values 
 (1,'Arul',100,null)
,(2,'Jane',120,'New York')

Select B.*
 From ( values (cast((Select Top 1 * From @AnyTableOrQuery for XML RAW,ELEMENTS XSINIL) as xml))) A(XMLData)
 Cross Apply (
                Select Column_Name  = a.value('local-name(.)','varchar(100)')
                      ,Column_Value = a.value('.','varchar(max)') 
                 From  A.XMLData.nodes('/row')  as C1(n)
                 Cross Apply C1.n.nodes('./*') as C2(a)
             ) B

Возврат

Column_Name Column_Value
EmpID       1
EmpName     Arul
Salary      100
Location    

EDIT

@MauryMarkowitz Предоставил гораздо лучшее решение (см. Комментарий ниже)

sp_describe_first_result_set @tsql =  N'Select * from YourTable'

Очаровательный! Я ненавижу работать с XML в SQLS, но это решение!

Maury Markowitz 08.01.2019 16:56

@MauryMarkowitz Рад помочь. Я медленно воспринял XML, но «обнаружил» его полезность в определенных ситуациях.

John Cappelletti 08.01.2019 16:58

@MauryMarkowitz Если все решения SQL подходят, я бы использовал sp_describe_first_result_set

GSerg 09.01.2019 13:07

@MauryMarkowitz ОЧЕНЬ ЛУЧШЕ !! Спасибо за совет

John Cappelletti 09.01.2019 13:12

@MauryMarkowitz Я обязательно добавлю эту стрелу в свой колчан. Он предоставляет больше информации, но имеет несколько недостатков ... удвоение среднего времени выполнения 403 мс по сравнению с 198 мс, и, будучи SP, он плохо интегрируется в TVF. В любом случае, еще раз спасибо за направление.

John Cappelletti 09.01.2019 13:57

@JohnCappelletti being a sp it does not integrate well in a TVF - sys.dm_exec_describe_first_result_set

GSerg 09.01.2019 18:56

@GSerg Вот и все! Я делаю глубокое погружение, чтобы увидеть, что еще я пропустил. Этим утром я чувствовал себя довольно хорошо. Теперь не так уж и много. :)

John Cappelletti 09.01.2019 19:11

Другие вопросы по теме