#c# #sql #sql-server-2017 #aspxgridview #for-xml-path
#c# #sql #sql-server-2017 #aspxgridview #for-xml-path
Вопрос:
Я пытаюсь выяснить, есть ли способ взять строковые данные в столбцах Name, Address и DSL, которые были объединены в STUFF() и XML PATH, и отобразить их вертикально в той же строке, а не горизонтально на интерфейсе. Я использую gridview для отображения информации.
SELECT i.[InstrumentID], it.[InstrumentType],i.[InstrumentNumber], i.[NANumber],i.[DateTimeFiled],
STUFF((SELECT ', ' n.[Surname] n.[GivenName] '(' nc.[NameCode] ')' FROM [dbo].[tblName] n
INNER JOIN [dbo].[tblNameCode] nc ON nc.[NameCodeID] = n.[NameCodeID] Where n.[InstrumentID] = i.[InstrumentID] ORDER BY n.[Surname] FOR XML PATH (''), TYPE).value('.', 'varchar(max)'), 1, 1, '') AS Name ,
STUFF(( SELECT ',' a.[StreetNumber] a.[StreetName] FROM [dbo].[tblAddress] a Where a.[InstrumentID] = i.[InstrumentID] ORDER BY a.[StreetName] FOR XML PATH (''), TYPE).value('.', 'varchar(max)'), 1, 1, '') AS Address,
STUFF(( SELECT '' d.[District] ' ' d.[Square] ' ' d.[Lot] ', ' FROM [dbo].[tblDLS] d WHERE d.[InstrumentID] = i.[InstrumentID] FOR XML PATH (''), TYPE).value('.', 'varchar(max)'), 1, 1,'') AS DSL
FROM [dbo].[tblInstrument] i
INNER JOIN [dbo].[tblInstrumentType] it ON i.[InstrumentTypeID] = it.[InstrumentTypeID]
WHERE InstrumentNumber = 1
ORDER BY InstrumentNumber, InstrumentType
Вот мой вывод
В получении результатов нет ничего плохого. Проблема заключается в вертикальном расположении данных. Вот скриншот моей программы также:
Вот код aspx для отображения информации:
<Columns>
<asp:TemplateField HeaderText="Instrument #, Type, Dist., Squ. , Lot">
<ItemTemplate>
<asp:LinkButton ID="LbPath" runat="server"
Text='<%# String.Format("{0} {1}", Eval("InstrumentNumber"), Eval("InstrumentType")) %>'
CommandName="GetInstrument"
CommandArgument='<%#Bind("instrumentID") %>'>
</asp:LinkButton>
<br />
<asp:Label ID="lblDateFiled" runat="server" Text='<%# Eval("DateTimeFiled") %>'> </asp:Label>
<br />
<asp:Label ID="lblNANumber" runat="server" Font-Names="Segoe UI Semibold" Font-Size="Medium" Text="NA Number: " ForeColor="#434343"></asp:Label><%# Eval("NANumber") %>
<br />
<br />
<asp:Label ID="lblDSL" runat="server" Text='<%#Eval("DSL") %>'> </asp:Label>
<%--<asp:Label ID="lblDSL" runat="server" Text='<%# String.Format("{0} {1} {2}", Eval("District"), Eval("Square"), Eval("Lot")) %>'> </asp:Label> --%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name, Address" SortExpression="Surname">
<ItemTemplate>
<EditItemTemplate>
<%-- <asp:Label ID="label1" runat="server" Text='<%# Bind("instrumentID") %>' ></asp:Label>--%>
</EditItemTemplate>
<asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>'></asp:Label>
<%-- <asp:Label ID="lblName" runat="server" Text='<%# String.Format(" {0}, {1} ({2})", Eval("Surname"), Eval("GivenName"), Eval("Namecode")) %>'></asp:Label>--%>
<br />
<asp:Label ID="lblAddress" runat="server" Font-Names="Segoe UI Semibold" Font-Size="Medium" Text='<%# Eval("Address") %>'></asp:Label>
<%--<asp:Label ID="lblAddress" runat="server" Font-Names="Segoe UI Semibold" Font-Size="Medium" Text='<%# String.Format("{0} {1} {2}", Eval("Subdivision"), Eval("StreetNumber"), Eval("StreetName")) %>'></asp:Label>--%>
</ItemTemplate>
</asp:TemplateField>
<%-- <asp:BoundField DataField="InstrumentType" HeaderText="Instrument Type" InsertVisible="false" ReadOnly="true" SortExpression="InstrumentType" />
<asp:BoundField DataField="NANumber" HeaderText="NANumber" InsertVisible="false" SortExpression="NANumber" />
<asp:BoundField DataField="DateTimeFiled" HeaderText="DateTimeFiled" InsertVisible="false" ReadOnly="true" SortExpression="DateTimeFiled" />--%>
</Columns>
Комментарии:
1. Я не понимаю. Какое отношение к отображению данных имеет Sql Server?
2. Это больше похоже на запрос уровня представления. Даже тогда неясно, что вы имеете в виду по вертикали. Вы хотите, чтобы имя и адрес были вертикальными в одной ячейке? Если это так, и предполагается, что HTML, просто добавьте <br> при создании строки. Кроме того, поскольку вы находитесь в 2017 году, вы можете использовать string_agg() вместо метода stuff / xml.
3. @JohnCappelletti да, вы могли бы сказать уровень представления. Я отредактировал свой вопрос и добавил больше ясности, чтобы посмотреть, поможет ли это. Я пытаюсь просто заставить данные отображаться вертикально в одном столбце, а не встраиваться в одну строку с разделителем. Спасибо, что потратили время
Ответ №1:
Предполагая, что я понимаю ваши потребности, вы могли бы попробовать что-то вроде следующего:
/* Create a mock-up table with sample data */
DECLARE @Data TABLE (
InstrumentID INT, InstrumentType VARCHAR(50), InstrumentNumber INT, NANumber INT, DateTimeFiled DATETIME, [Name] VARCHAR(255)
);
INSERT INTO @Data ( InstrumentID, InstrumentType, InstrumentNumber, NANumber, DateTimeFiled, [Name] )
VALUES
( 1625168, 'ACCOUNTS RECEIVABLE', 1, 785401, '1989-01-03 09:48:03.000', 'HIBERNIA NATIONAL BANK NEW ORLEANS' ),
( 1382385, 'SALE', 1, 785467, '1989-01-03 10:14:03.000', 'M amp; M RESTAURANT AND LOUNGE, INC' );
/* "Pivot" the columnar data */
SELECT
x.f.value( 'fn:local-name(.)', 'VARCHAR(50)' ) AS [name],
x.f.value( '.', 'VARCHAR(255)' ) AS [value]
FROM (
/* Insert your T-SQL here... */
SELECT CAST ( ( SELECT
InstrumentID, InstrumentType, InstrumentNumber, NANumber, DateTimeFiled, [Name]
FROM @Data
FOR XML PATH( 'Data' ) ) AS XML ) AS DataXml
) AS d
CROSS APPLY d.DataXml.nodes( '//Data/*' ) x( f );
ВОЗВРАТ
------------------ ------------------------------------
| name | value |
------------------ ------------------------------------
| InstrumentID | 1625168 |
| InstrumentType | ACCOUNTS RECEIVABLE |
| InstrumentNumber | 1 |
| NANumber | 785401 |
| DateTimeFiled | 1989-01-03T09:48:03 |
| Name | HIBERNIA NATIONAL BANK NEW ORLEANS |
| InstrumentID | 1382385 |
| InstrumentType | SALE |
| InstrumentNumber | 1 |
| NANumber | 785467 |
| DateTimeFiled | 1989-01-03T10:14:03 |
| Name | M amp; M RESTAURANT AND LOUNGE, INC |
------------------ ------------------------------------
Комментарии:
1. Спасибо, что нашли время, чтобы помочь мне. Я отредактировал свой вопрос, чтобы уточнить, что я пытаюсь сделать. Основываясь на том, что я изначально спросил, вы дали мне правильный ответ. Сможете ли вы проверить мое редактирование и посмотреть, сможете ли вы помочь мне еще раз? Спасибо