Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Raporty typu danych SQL Server BIT różnią się dla zapytań dotyczących widoku i tabeli

Typ danych bitowych jest różnie interpretowany przez klientów. SSMS, zgłosi 1 lub 0 przez chwilę, podczas gdy ten sam 1/0 jest interpretowany przez przepływ danych SSIS jako True lub False .

To, czy źródłem jest tabela, czy widok, nie ma znaczenia dla SSIS, chyba że jawnie zmienisz typ danych.

Do konfiguracji utworzyłem 2 tabele i widok

CREATE TABLE dbo.BaseTable
(
    SomeBit bit NOT NULL
,   RowDescription varchar(50) NOT NULL
);
CREATE TABLE dbo.TargetTable
(
    SomeBit bit NOT NULL
,   RowDescription varchar(50) NOT NULL
,   SourcePackage nvarchar(100) NOT NULL
);
GO
CREATE VIEW dbo.MyView
AS
SELECT
    BT.SomeBit
,   BT.RowDescription
FROM
    dbo.BaseTable AS BT;
GO
INSERT INTO 
    dbo.BaseTable
(
    SomeBit
,   RowDescription
)
VALUES
    (CAST(0 AS bit), 'Falsification')
,   (CAST(1 AS bit), 'True dat');
GO

W tym momencie, jeśli użyję SSMS i zapytam dbo.BaseTable lub dbo.MyView, otrzymam 1 i 0. Ale znowu, są to tylko artefakty prezentacji. W C 0 to fałsz, a każda wartość liczbowa, która nie jest równa 0, jest prawdziwa. Excel przedstawi to jako FAŁSZ i PRAWDA. Każdy klient zinterpretuje wartość na jakąkolwiek lokalną reprezentację wartości logicznej. Firma SSIS wybrała Prawda i Fałsz.

Zbudowałem prosty pakiet, który pobiera dane z BaseTable lub MyView i zapisuje je do pliku tekstowego i tabeli.

Tak wygląda podstawowy przepływ sterowania

Przepływ danych wygląda na złożony, ale tak nie jest.

Wybieram z mojej tabeli lub widoku, dodaję opis mojej tabeli docelowej, używam multiemisji, aby móc wysyłać te same dane do wielu miejsc docelowych, a następnie pisać do pliku i tabeli.

Jeśli zapytam SSMS o moje źródła i miejsca docelowe, zobaczysz, że biblioteki docelowe obsługują tłumaczenie między lokalną i zagraniczną reprezentacją typu danych.

Takie tłumaczenie nie jest dostępne dla zwykłego pliku, ponieważ nie ma „standardu” reprezentacji wartości logicznej. może lubię T/N. Mimo to

Próbowałem kilku rzeczy, aby wymusić zapisanie 1/0 do pliku płaskiego. Ustawiłem moje typy danych na

  • Boole'owskie DT_BOOL
  • Pojedynczy bajt podpisany int DT_I1
  • Cztery bajty podpisane int DT_I4
  • Ciąg DT_STR

ale to nigdy nie miało znaczenia (co w rzeczywistości wydaje się dziwne, biorąc pod uwagę, jak przewrotny SSIS dotyczy typów danych) --- moje dane wyjściowe były zawsze takie same

False,Falsification
True,True dat

Ostatecznie, jeśli chciałem 0 lub 1 w tym pliku wyjściowym, musiałem zmienić mój typ danych:w zapytaniu źródłowym z jawnym rzutowaniem lub przez składnik kolumny pochodnej przy użyciu operatora potrójnego SomeBit ? (DT_I1)1 : (DT_I1)0 . Użyj DT_I1/I2/I4/I8 według własnego uznania

Zabawna ciekawostka:jeśli zdecydujesz się użyć komponentu konwersji danych, otrzymasz 0 za fałsz, -1 za prawdę lub jeśli użyjesz leniwego rzutowania w komponencie pochodnym (DT_I1) SomeBit Wygląda na to, że są zgodne z interpretacją C wartości logicznych.

Zrób to

Nie musisz mi wierzyć na słowo. Korzystając z powyższych definicji tabeli i populacji wartości, jeśli zainstalujesz bezpłatny dodatek BIDS Helper możesz wygenerować ten sam kod dla dowolnej wersji SSIS.

Po zainstalowaniu BIDS Helper, kliknij prawym przyciskiem myszy projekt SSIS iw menu kontekstowym wybierz Dodaj plik Biml. Zastąp zawartość tego pliku poniższym kodem; zapisz, a następnie kliknij prawym przyciskiem myszy, aby wygenerować nowy pakiet.

Będziesz musiał edytować wartości dla połączenia plików płaskich, aby wskazywały prawidłowe lokalizacje, a także wskazywały ciąg połączenia ole db tam, gdzie rozkręcisz swoje tabele.

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <FlatFileConnection FilePath="C:\ssisdata\so_29244868.table.csv" FileFormat="FFF_table" Name="FF_Table" />
        <FlatFileConnection FilePath="C:\ssisdata\so_29244868.view.csv" FileFormat="FFF_table" Name="FF_View" />
        <OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.0;Integrated Security=SSPI;" />
    </Connections>
    <FileFormats>
        <FlatFileFormat
            Name="FFF_table" IsUnicode="false" CodePage="1252"
            FlatFileType="RaggedRight">
            <Columns>
                <Column Name="SomeBit" DataType="Boolean" Delimiter="," />
                <Column Name="RowDescription" DataType="AnsiString" Length="50" Delimiter="CRLF"/>
            </Columns>

        </FlatFileFormat>
    </FileFormats>
    <Packages>
        <Package ConstraintMode="Parallel" Name="so_29244868">
            <Tasks>
                <Dataflow Name="DFT Table example">
                    <Transformations>
                        <OleDbSource ConnectionName="CM_OLE" Name="OLE_SRC dbo_BaseTable">
                            <ExternalTableInput Table="dbo.BaseTable" />
                        </OleDbSource>
                        <DerivedColumns Name="DER Package name">
                            <Columns>
                                <Column DataType="String" Name="SourcePackage" Length="100">"DFT Table example"</Column>
                            </Columns>
                        </DerivedColumns>
                        <Multicast Name="MC Dupe">
                            <OutputPaths>
                                <OutputPath Name="FF" />
                                <OutputPath Name="Table" />
                            </OutputPaths>
                        </Multicast>
                        <FlatFileDestination ConnectionName="FF_Table" Name="FF_DST table">
                            <InputPath OutputPathName="MC Dupe.FF" />
                        </FlatFileDestination>
                        <OleDbDestination 
                            ConnectionName="CM_OLE" 
                            Name="OLE_DST Table"
                            TableLock="false">
                            <InputPath OutputPathName="MC Dupe.Table" />
                            <ExternalTableOutput Table="[dbo].[TargetTable]"></ExternalTableOutput>
                        </OleDbDestination>
                    </Transformations>
                </Dataflow>
                <Dataflow Name="DFT View example">
                    <Transformations>
                        <OleDbSource ConnectionName="CM_OLE" Name="OLE_SRC dbo_MyView">
                            <ExternalTableInput Table="dbo.MyView" />
                        </OleDbSource>
                        <DerivedColumns Name="DER Package name">
                            <Columns>
                                <Column DataType="String" Name="SourcePackage" Length="100">"DFT View example"</Column>
                            </Columns>
                        </DerivedColumns>
                        <Multicast Name="MC Dupe">
                            <OutputPaths>
                                <OutputPath Name="FF" />
                                <OutputPath Name="Table" />
                            </OutputPaths>
                        </Multicast>
                        <FlatFileDestination ConnectionName="FF_View" Name="FF_DST view">
                            <InputPath OutputPathName="MC Dupe.FF" />
                        </FlatFileDestination>
                        <OleDbDestination 
                            ConnectionName="CM_OLE" 
                            Name="OLE_DST view"
                            TableLock="false"
                            >
                            <InputPath OutputPathName="MC Dupe.Table" />
                            <ExternalTableOutput Table="[dbo].[TargetTable]"></ExternalTableOutput>
                        </OleDbDestination>
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zamienić ciąg w kolumnie tabeli SQL Server?

  2. Utwórz funkcję partycji w SQL

  3. Jak asynchronicznie wykonać procedurę składowaną serwera sql i zapewnić jej zakończenie?

  4. Hibernacja (/JPA) stronicowania po stronie serwera i MS SQL Server

  5. Używanie PIVOT i JOIN razem