Привет, у меня есть проблема, которую я не могу решить в одиночку, так как чертова отладка не работает на моем хосте. Короче говоря, когда я пытаюсь преобразовать тип datetime в varchar из одного столбца в Таблице 1 и использовать его в качестве параметра для моего хранимогоПроцедура я получаю сообщение об ошибке, но когда я пишу точно то же самое, но с N '.. string ...' все в порядке, я действительно запутался, вот оно:
Таблица 1: Id (Идентификатор int, неnull) Сообщение (nvarchar (max) DisableComments (int) DateTime (datetime) Цвет (nvarchar) Имя пользователя (nvarchar)
ID | Message | DisableComments | DateTime | Color | Username
18 | Comment | 0 | 2011-12-18 14:16:27.000 | #000000 | User
Вот запрос, который работает нормально:
DECLARE @return_value int
SELECT TOP 1 [ID]
,[Message]
,[DisableComments]
,[DateTime]
,[Color]
,[Username]
FROM Thoughts
EXEC @return_value = InsertThoughtToPartition
@ThoughtMessage = Message,
@ThoughtDateTime = N'2012-01-03 01:22:31.000',
@ThoughtColor = Color,
@ThoughtUsername = Username
SELECT 'Return Value' = @return_value
Здесьэто запрос, который выдает ошибку: «Преобразование не удалось при преобразовании даты и / или времени из символьной строки.»:
DECLARE @return_value int
SELECT TOP 1 [ID]
,[Message]
,[DisableComments]
,[DateTime]
,[Color]
,[Username]
,CONVERT(nvarchar(MAX),DateTime, 121) as Datei
FROM Thoughts
EXEC @return_value = InsertThoughtToPartition
@ThoughtMessage = Message,
@ThoughtDateTime = Datei,
@ThoughtColor = Color,
@ThoughtUsername = Username
SELECT 'Return Value' = @return_value
А вот моя хранимая процедура, которую я выполняю:
USE [TagCloudDb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE InsertThoughtToPartition
(
@ThoughtMessage as nvarchar(MAX),
@ThoughtDateTime as nvarchar(MAX),
@ThoughtColor as nvarchar(MAX),
@ThoughtUsername as nvarchar(MAX)
)
AS
DECLARE @MonthName nvarchar(MAX);
DECLARE @CurrentYear nvarchar(MAX);
DECLARE @InsertTableName nvarchar(MAX);
Declare @CreateTable nvarchar(MAX);
Declare @JustInsert nvarchar(MAX);
SET @CurrentYear = CAST((SELECT DATENAME(year, CAST(@ThoughtDateTime as datetime))) as nvarchar(MAX));
SET @MonthName = CAST((SELECT DATENAME(month, CAST(@ThoughtDateTime as datetime))) as nvarchar(MAX));
SET @InsertTableName = 'Thoughts_' + @MonthName + '_' + @CurrentYear;
IF OBJECT_ID(@InsertTableName) IS NOT NULL
BEGIN
SET @JustInsert = 'INSERT INTO '+ @InsertTableName + '(Message,DateTime,Color,Username)
VALUES('''+ @ThoughtMessage+''',CONVERT(DATETIME,'''+ @ThoughtDateTime +''', 121),'''+@ThoughtColor+''','''+@ThoughtUsername+''')';
EXEC(@JustInsert);
END
ELSE
BEGIN
SET @CreateTable = '
USE [TagCloudDb]
CREATE TABLE ['+ @InsertTableName+'](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Message] [nvarchar](max) NOT NULL,
[DateTime] [datetime] NOT NULL,
[Color] [nvarchar](max) NOT NULL,
[Username] [nvarchar](max) NOT NULL,
UniqueID as CAST(ID as nvarchar) +''-''+ CONVERT(VARCHAR(8), DateTime, 112)
) ON [PRIMARY]
INSERT INTO '+ @InsertTableName + '(Message,DateTime,Color,Username)
VALUES('''+ @ThoughtMessage+''',CONVERT(DATETIME,'''+ @ThoughtDateTime + ''', 121),'''+@ThoughtColor+''','''+@ThoughtUsername+''')';
EXEC(@CreateTable);
END
GO
здесь обновленная версия с DateTime в качестве входных данных, и все же я получаю ту же ошибку с двумя запросами: первый запрос работает хорошо, но когда я пытаюсь передать Datei или [DateTime] из первой таблицы, я получаю ошибку при преобразовании данныхтип nvarchar to datetime.
USE [TagCloudDb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE InsertThoughtToPartition
(
@ThoughtMessage as nvarchar(MAX),
@ThoughtDateTime as DateTime,
@ThoughtColor as nvarchar(MAX),
@ThoughtUsername as nvarchar(MAX)
)
AS
DECLARE @MonthName nvarchar(MAX);
DECLARE @CurrentYear nvarchar(MAX);
DECLARE @InsertTableName nvarchar(MAX);
Declare @CreateTable nvarchar(MAX);
Declare @JustInsert nvarchar(MAX);
DECLARE @JustInsertParamDef nvarchar(MAX);
SET @CurrentYear = DATENAME(year, @ThoughtDateTime);
SET @MonthName = DATENAME(month, @ThoughtDateTime);
SET @InsertTableName = 'Thoughts_' + @MonthName + '_' + @CurrentYear;
SET @JustInsert = N'INSERT INTO '+ @InsertTableName + '(Message, DateTime, Color, Username)
VALUES(@ThoughtMessage, @ThoughtDateTime ,@ThoughtColor, @ThoughtUsername)';
SET @JustInsertParamDef = N'@InsertTableName nvarchar(MAX), @ThoughtMessage nvarchar(MAX), @ThoughtDateTime datetime,
@ThoughtColor nvarchar(MAX), @ThoughtUsername nvarchar(MAX)';
IF OBJECT_ID(@InsertTableName) IS NOT NULL
BEGIN
EXECUTE sp_executesql
@JustInsert,
@JustInsertParamDef,
@InsertTableName,
@ThoughtMessage,
@ThoughtDateTime,
@ThoughtColor,
@ThoughtUsername;
END
ELSE
BEGIN
SET @CreateTable = 'USE [TagCloudDb]
CREATE TABLE ['+@InsertTableName+'](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Message] [nvarchar](max) NOT NULL,
[DateTime] [datetime] NOT NULL,
[Color] [nvarchar](max) NOT NULL,
[Username] [nvarchar](max) NOT NULL,
[UniqueID] as CAST(ID as nvarchar) + ''-'' + CONVERT(VARCHAR(8), DateTime, 112)
) ON [PRIMARY]'
EXEC(@CreateTable);
EXECUTE sp_executesql
@JustInsert,
@JustInsertParamDef,
@InsertTableName = @InsertTableName,
@ThoughtMessage = @ThoughtMessage,
@ThoughtDateTime = @ThoughtDateTime,
@ThoughtColor = @ThoughtColor,
@ThoughtUsername = @ThoughtUsername;
END