это возможно сделать
DECLARE @guid uniqueidentifier = NEWID();
select @guid
CREATE TABLE @guid
(
[UserId] uniqueidentifier NOT NULL DEFAULT NewID(),
[FirstName] nvarchar(30),
[LastName] nvarchar(30),
[Email] nvarchar(50)
)
Я просто пробую эту концепцию, если она работает, я буду использовать ее в своем веб-приложении.
приведенный выше код не работает
это сложно объяснить, но я создам каждую таблицу для конкретного пользователя, запишу это имя таблицы внутри пользователя таблицы для справки.
Звучит как ужасный дизайн базы данных
Они не спрашивали, хороший ли это дизайн, они спрашивали, можно ли сделать то, что они хотят.
Какое сообщение об ошибке вы получаете, когда запускаете запрос, который не работает?
@gowner всегда стоит пытаться обучить новичков лучшим методам проектирования.
Я открыт для предложений, @DaleK, большое спасибо за ваш жест, я изначально думал, что добавление в разные таблицы сэкономит время при загрузке данных из БД в приложение, поэтому я так подумал.
SQL в первую очередь предназначен для статической схемы, а не для изменения на лету. И обычно у вас есть пользовательская таблица со строкой для каждого пользователя, а любые другие таблицы, относящиеся к пользователю, имеют столбец идентификатора пользователя с внешним ключом для пользовательской таблицы.
Я не понимаю, почему ты когда-либо хотел это сделать. Похоже, вам нужна только одна таблица с другим столбцом Guid для определения массового импорта.
Вы не можете напрямую использовать имя динамической таблицы, но вы можете сначала построить SQL в строковой переменной и выполнить ее; техника известна как динамический SQL:
DECLARE @guid uniqueidentifier = NEWID();
DECLARE @strSql nvarchar(max)= N'CREATE TABLE ['+cast(@guid as nvarchar(50))+']
(
[UserId] uniqueidentifier NOT NULL DEFAULT NewID(),
[FirstName] nvarchar(30),
[LastName] nvarchar(30),
[Email] nvarchar(50)
)'
select @guid
exec sp_executesql @strSql;
Я добавил квадратные скобки вокруг имени таблицы, потому что представление guid по умолчанию содержит дефисы.
Если источник имени таблицы не является идентификатором GUID (т. е. может содержать специальные символы, предоставленные пользователем и т. д.), рекомендуется очистить его перед использованием. Вы можете использовать QUOTENAME() для этой цели:
... + quotename(cast(@guid as nvarchar(50))) + ...
Гораздо безопаснее использовать QUOTENAME()
, чем вручную печатать [
и ]
.
Согласитесь, безопаснее использовать эту функцию, если имя получено из ненадежных источников. В этом примере это не имеет никакого значения.
Последовательность и подача хороших примеров > «На этот раз все в порядке».
@tinazmu - контрапункт: вам не нужно прыгать через какие-либо дополнительные обручи, чтобы сделать это с quotename()
. Так что же вы сохранили (кроме девяти символов)?
@BenThul, я против того, чтобы делать что-то без причины, и в этом случае нет никакого риска (вы бы носили шляпу в помещении, потому что это хорошая практика?)
Вы бы показали ребенку, как пить из бутылочки с хлорной известью, только в том случае, если бы вы знали, что бутылка тщательно вымыта и наполнена апельсиновым соком? Или что круто не пристегиваться ремнем безопасности, когда просто подъезжаешь к углу? Другими словами, зачем продвигать методы, которые иногда могут быть вредными, вместо методов, которые всегда безопаснее?
Между тем, вы назначаете переменную nvarchar
, не обозначая строку префиксом N
, еще одна вещь, которая может не сломаться здесь, но может сломаться в других сценариях, когда люди «учатся» на вашем коде.
Приятно добавить заявление об отказе от ответственности после кода, в котором говорится: «Если у вас есть уязвимость, вы можете сделать это вместо этого»… но все же, почему бы не делать все время более безопасные вещи? Читатели не обязательно будут знать, что им может понадобиться «очистить» ввод, и я не знаю, почему вы когда-либо предлагали метод, который может сломаться. «Причина», которую вы ищете, заключается в том, что обучение людей «лучшим практикам» намного лучше, чем обучение их «практикам, которые в большинстве случаев приемлемы».
Какая польза от таблицы со случайным именем?