2011-03-03 3 views
0

Мне нужно выбрать 45 полей из записи, в которой есть 96 из них (не спрашивайте меня, но я не могу их нормализовать, если бы мог). Итак, у меня есть эта страница, которая будет нуждаться во всех этих 45, когда она загружается перед пользователем.несколько параметров для хранимой процедуры

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

Теперь, мой вопрос: 1, это правильный способ сделать это? Во-вторых, если я не могу понять, как выбрать поля и поместить их на один параметр.

select @sql = ' select 'field1' + 'field2' + 'field3'..... 

im confused с чего начать?

+1

что не так, просто используя обычное поле выбора1, поле2, ... из таблицы1? не делайте его более сложным, чем есть, особенно если нет веской причины. –

+0

Это может быть только я, но не следует ли хранить хранимые процедуры, когда это возможно? Также почему бы просто не выбрать нужные столбцы? И как побочный элемент, в зависимости от того, как выглядит ваш пользовательский интерфейс и какая у вас свобода, возможно, вы могли бы его реорганизовать, чтобы ограничить общий объем информации, отображаемой сразу (мне не очень нравится просмотр сложных пользовательских интерфейсов). – dSebastien

+4

@dSebastien - при необходимости следует использовать хранимые процедуры. Почему они существуют иначе? – Oded

ответ

2

Хорошо, что вы делаете этот путь более сложным, чем это должно быть. Как в мире у вас есть 96 столбцов на одной таблице, я никогда не узнаю, но чтобы выбрать нужный вам 45, вам просто нужно будет напечатать 45 столбцов в инструкции select.

Вот пример того, как будет выглядеть SQL. Естественно, я не собираюсь набирать 45 столбцов, но вы получите идею:

SELECT FirstName, LastName, Age, [keep going to 45] FROM tblUsers 

Другой вопрос, который я хотел бы затронуть это то, как вы выполняете ваш SQL заявление. НИКОГДА НИКОГДА НИКОГДА НИКОГДА НИКОГДА НИКОГДА НИКОГДА не объединяйте строковые переменные в одну строку SQL. Убедитесь, что вы используете параметризованные запросы, по крайней мере. Но я бы порекомендовал также искать в Entity Framework или LINQ to SQL.

SqlCommand scomm = new SqlCommand("UPDATE tblUsers SET FirstName='" + firstName + "' WHERE UserID='" + userId + "'"); 

Это ^^^ равно очень плохой. Подумайте о том, что произойдет, если пользователь решит быть подлым и сделать свое имя Harry' AND Admin='true. Вы можете подумать, «О, ну я просто делать firstName = firstName.Replace("'","''"); на всех моих переменных Если вы сделаете это, я лично пришел удар вам Спараметрировать ваши запросы как это:..

SqlCommand scomm = new SqlCommand("UPDATE tblUsers SET [email protected] WHERE [email protected]"); 
scomm.Parameters.Add(new SqlParameter("FirstName", firstName)); 
scomm.Parameters.Add(new SqlParameter("UserID", userId)); 

что ^^^ равно намного лучше .

EDIT Кроме того, если вы когда-либо получить шанс повторно работу, монстр из таблицы у вас есть, попробуйте рефакторинга подмножества полей в их собственной сущности (таблицы) и связать их через идентификатор ссылки. Например, скажем, у меня есть таблица под названием [tlbUsers], и она содержит информацию о конкретном пользователе. Например:

[tlbUsers] 
UserID 
FirstName 
LastName 
Age 
Username 
StreetAddress 
City 
State 
ZipCode 
Country 
Phone 

Рассмотрим рефакторинг, чтобы соответствующие значения имели свою таблицу.Вы можете взять всю информацию об адресе из этой таблицы пользователей и поместить ее в таблицу под названием tlbAddresses. Это не только облегчило бы работу при загрузке данных, но и потенциально может сэкономить ваше место в базе данных. Например, если Гарри и Салли живут в одном доме, они могут ссылаться на одну и ту же запись адреса.

[tlbUsers] 
FirstName 
LastName 
Age 
Username 
AddressID 
Phone 

[tlbAddresses] 
AddressID 
Street 
City 
State 
ZipCode 
Country 
+0

так что да, я знаю, как сделать sql. то, что я спрашивал, заключается в том, что вместо того, чтобы писать 45 столбцов, я просто пытаюсь обойти поля и объединить их, чтобы я мог вставлять их в поле и значения в другое поле и использовать это как вывод моего sp. и я бы LOOOOVEEE нормализовал эту таблицу так плохо! Я просто не могу сейчас. – gdubs

+0

Да, к сожалению, я думаю, что этого зверя нужно будет нанять, набрав много в ваших запросах. Все остальное просто переборщило. В конечном итоге было бы проще реорганизовать таблицы. – Chev

0

У меня возникли проблемы с пониманием вашего вопроса, однако, если вы хотите передать переменное количество параметров в хранимую процедуру, есть два способа, которыми я могу думать, что вы можете это сделать, что требует SQL Server 2005 и SQL Server 2008 соответственно.

Первый использует XML. Попросите вашу процедуру принять аргумент varchar (max), а затем вы можете легко разделить его. Например, если вы запятой отделить то, что вы хотите, вы можете:

DECLARE @xml xml 
SET @xml = cast('<x>'+replace(@yourArg,',','</x><x>')+'</x>' as xml) 

SELECT N.value('.','varchar(max)') AS myArgName FROM @xml.nodes('x') AS T(N) 

Кроме того, вы можете использовать таблицу двузначных переменных и выбрать входы в таблицу и передать в хранимую процедуру. См. Пример http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters.

0

Вы можете вернуть данные в виде xml в одном поле.

Тест стол

create table TestTbl(ID int, F1 int, F2 int, F3 int, F4 int) -- to F96 

Тестовые данные

insert into TestTbl values (1, 2, 3, 4, 5) 

Запрос

select 
    (select 
    F1, F2, F3, F4 -- to F45 
    from TestTbl 
    where ID = 1 
    for xml path('root'), type) as XMLData 

Результат

XMLData 
----------------------------------------------------- 
<root><F1>2</F1><F2>3</F2><F3>4</F3><F4>5</F4></root> 

XML в поле XMLData

<root> 
    <F1>2</F1> 
    <F2>3</F2> 
    <F3>4</F3> 
    <F4>5</F4> 
</root> 
Смежные вопросы