Вам уже говорили, что этот подход совершенно неправильный. Но если вам нужно придерживаться этого, вы можете попробовать это:
Ваш тестовый сценарий в новой базе данных (осторожно, если вы уже используете это имя базы данных ...)
USE master;
GO
CREATE DATABASE MyTestDb;
GO
USE MyTestDb;
GO
CREATE TABLE [dbo].[TableA](
[ID] [int] NOT NULL,
[Title] [nvarchar](100) NOT NULL,
[TableBID] [int] NOT NULL
);
CREATE TABLE [dbo].[TableB](
[ID] [int] NOT NULL,
[TableName] [nvarchar](100) NOT NULL
);
CREATE TABLE [dbo].[ATTR_A](
[ID] [int] NOT NULL,
[TableAID] [int] NOT NULL,
[A21] [nvarchar](100) NOT NULL,
[A22] [int] NOT NULL
);
CREATE TABLE [dbo].[ATTR_B](
[ID] [int] NOT NULL,
[TableAID] [int] NOT NULL,
[A21] [nvarchar](100) NOT NULL,
[A22] [int] NOT NULL
);
CREATE TABLE [dbo].[ATTR_C](
[ID] [int] NOT NULL,
[TableAID] [int] NOT NULL,
[A21] [nvarchar](100) NOT NULL,
[A22] [int] NOT NULL
);
CREATE TABLE [dbo].[ATTR_D](
[ID] [int] NOT NULL,
[TableAID] [int] NOT NULL,
[A21] [nvarchar](100) NOT NULL,
[A22] [int] NOT NULL
);
INSERT INTO TableA VALUES(1, 'test', 1);
INSERT INTO TableB VALUES(1, 'ATTR_C');
INSERT INTO ATTR_C VALUES (1, 1, 'Name', 2019);
INSERT INTO TableA VALUES(2, 'test2', 2);
INSERT INTO TableB VALUES (2, 'ATTR_A');
INSERT INTO ATTR_A VALUES (1, 2, 'Name 2', 2016);
GO
- Я создаю встроенную табличную функцию , где все таблицы атрибутов возвращаются как один набор, используя UNION ALL
- Механизм достаточно умен, чтобы избежать вызова, если параметр не подходит.
CREATE FUNCTION dbo.GetTheRightSet(@SetKey VARCHAR(10))
RETURNS TABLE
AS
RETURN
SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_A WHERE @SetKey='ATTR_A'
UNION ALL
SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_B WHERE @SetKey='ATTR_B'
UNION ALL
SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_C WHERE @SetKey='ATTR_C'
UNION ALL
SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_D WHERE @SetKey='ATTR_D'
GO
- Вот как это использовать
SELECT TableA.*
,TableB.*
,TheSet.*
FROM TableA
LEFT JOIN TableB ON TableA.TableBID = TableB.ID
OUTER APPLY dbo.GetTheRightSet(TableB.TableName) TheSet
GO
- Очистить (осторожно с реальными данными)
USE master;
GO
DROP DATABASE MyTestDb;
Если при статической компоновке вы имеете в виду добавление всех объектных файлов (.o) в двоичный файл, это должно работать как динамический материал, если вы создали статическую библиотеку (.a), компоновщик не будет свяжите их внутри, так как только используемые объекты внутри статической библиотеки связаны, и в этом случае ни один из них не используется явно.
Все методы автоматической регистрации зависят от кода времени загрузки и его способов избежать статического фиаско, например, функция который создает объект и возвращает его по запросу.
Но если вам не удастся загрузить, что когда-либо это не сработает, объединение объектных файлов вместе сработает, а также загрузка динамических библиотек, но статические библиотеки никогда не будут компоноваться без явных зависимостей.
и только что обнаружил (для меня) идеальное решение:$ git config --global diff.tool vimdiff # or merge.tool to get merging too!
$ git difftool commit1 commit2
git difftool
принимает те же аргументы, что и git diff
, но запускает программу diff по вашему выбору вместо встроенного GNU diff
. Поэтому выберите многобайтовую разницу (в моем случае, vim
в режиме сравнения) и просто используйте git difftool
вместо git diff
.
Найти » difftool "слишком долго печатать? Нет проблем:
$ git config --global alias.dt difftool
$ git dt commit1 commit2
Git Rocks.
Считаете "difftool" слишком длинным для ввода? Нет проблем:
$ git config --global alias.dt difftool
$ git dt commit1 commit2
Git Rocks.
Считаете "difftool" слишком длинным для ввода? Нет проблем:
$ git config --global alias.dt difftool
$ git dt commit1 commit2
Git Rocks.
Вы пытались установить .gitattributes
для обработки его как текстового файла?
Например:
*.vmc diff
Более подробная информация на http://www.git-scm.com/docs/gitattributes.html .
По умолчанию похоже, что git
не будет хорошо работать с UTF-16; для такого файла вы должны убедиться, что обработка CRLF
не выполняется, но вы хотите, чтобы diff
и объединяли
для работы как обычный текстовый файл ( это игнорирует, может ли ваш терминал / редактор обрабатывать UTF-16.) ]:
[attr]binary -diff -crlf
Так что мне кажется, что вы можете определить пользовательский атрибут на своем верхнем уровне .gitattributes
для utf16
(обратите внимание, что я добавляю слияние здесь, чтобы быть уверенным, что оно обрабатывается как текст):
[attr]utf16 diff merge -crlf
Оттуда вы сможете указать в любом файле .gitattributes
что-то вроде:
*.vmc utf16
Также обратите внимание, что вы все равно должны иметь возможность diff
файла, даже если git
считает, что он двоичный с:
git diff --text
Edit
Этот ответ в основном говорит что GNU diff с UTF-16 или даже UTF-8 работает не очень хорошо. Если вы хотите, чтобы git
использовал другой инструмент для просмотра различий (через - ext-diff
), этот ответ предполагает Guiffy .
Но что вам, скорее всего, нужно просто diff
файл UTF-16, который содержит только символы ASCII. Чтобы заставить это работать, используйте - ext-diff
и следующий скрипт оболочки:
#!/bin/bash
diff <(iconv -f utf-16 -t utf-8 "$1") <(iconv -f utf-16 -t utf-8 "$2")
Обратите внимание, что преобразование в UTF-8 может также работать для слияния, вы просто должны убедиться, что это делается в обоих направлениях.
Что касается вывода на терминал при просмотре различий файла UTF-16: бинарный мусор выбросил на экран. Если git использует GNU diff, это кажется, что GNU diff не с поддержкой Unicode.
GNU diff на самом деле не заботится о Unicode, поэтому, когда вы используете diff --text, он просто diff и выводит текст. Проблема в том, что используемый вами терминал не может обрабатывать испускаемый UTF-16 (в сочетании с метками diff, которые являются символами ASCII).
Решением является фильтрация через cmd.exe / c "type% 1"
. Встроенная команда cmd type
выполняет преобразование, и поэтому вы можете использовать это с возможностью textconv команды git diff, чтобы включить текстовое различие файлов UTF-16 (также должно работать с UTF-8, хотя и не тестировалось).
Цитата из справочной страницы gitattributes:
Иногда желательно увидеть разницу для преобразованных в текст версии некоторых двоичных файлов. Например, документ текстового процессора может быть преобразован в текстовое представление ASCII и отображаемый текст. Несмотря на то, что это преобразование теряет некоторую информацию, полученное различие полезно для просмотра человеком (но не может применяться напрямую).
Параметр конфигурации textconv используется для определения программы для выполнения такого преобразования. Программа должна принимать единственный аргумент, имя файла, который нужно преобразовать, и выдавать результирующий текст на стандартный вывод.
Например, чтобы показать различие информации exif файла вместо двоичной информации (при условии, что у вас есть установленный инструмент exif) добавьте следующий раздел в свой файл $ GIT_DIR / config
(или файл $ HOME / .gitconfig
):
[diff "jpg"]
textconv = exif
Решение для mingw32 , Поклонникам cygwin, возможно, придется изменить подход. Проблема заключается в передаче имени файла для преобразования в cmd.exe - он будет использовать косую черту, а cmd предполагает использование разделителей каталогов обратной косой чертой.
Создайте сценарий с одним аргументом, который будет выполнять преобразование в стандартный вывод. c: \ path \ to \ some \ script.sh:
#!/bin/bash
SED='s/\//\\\\\\\\/g'
FILE=\`echo $1 | sed -e "$SED"\`
cmd.exe /c "type $FILE"
Настройте git, чтобы иметь возможность использовать файл сценария. Внутри вашей конфигурации git ( ~ /.