Я знаю, что это немного, но я ищу решение с 4 дней. Я просто хочу, чтобы EXEC ВСТАВИТЬ, но я всегда получаю некоторые загадочные сообщения об ошибках в SSMSEXEC INSERT с динамической схемой TSQL SSMS
ВХОД (переменные неправильно так ErrorLog должны заполняться):
USE [Tfs_GitInterface]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[spInsertChangeLevel2]
@repositoryName = N'asdasd',
@commitId = 213123,
@changeLevel = N'asda'
SELECT 'Return Value' = @return_value
GO
хранимых процедур:
CREATE PROCEDURE [dbo].[spInsertChangeLevel2]
-- Add the parameters for the stored procedure here
@repositoryName [nvarchar](256),
@commitId [binary](20),
@changeLevel [nvarchar](400)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @repId [int]
DECLARE @commitIdValid [int];
DECLARE @errorOccured [BIT] = 0;
DECLARE @schema [nvarchar](400) = 'dbo';
DECLARE @schemaPlusTable [nvarchar](400) = @schema + '.tbl_ErrorLog';
DECLARE @changeErrorMsg [nvarchar](400) = 'Wrong ChangeLevel';
DECLARE @changeSQL [nvarchar](MAX);
BEGIN TRY
IF
(@changeLevel <> 'NewFeature' AND @changeLevel <> 'Patch' AND @changeLevel <>'BreakingChange')
BEGIN
PRINT 'Wrong ChangeLevel';
EXEC('INSERT INTO [' + @schema + '].[tbl_ErrorLog] ([repositoryName], [commitId], [changeLevel], [error], [timestamp])
VALUES ("test" , ' + @commitId + ' , ' + @changeLevel + ' , ' + @changeErrorMsg + ' , SYSDATETIME())');
SET @errorOccured = 1;
END
IF NOT EXISTS
(SELECT InternalRepositoryId FROM dbo.tbl_GitRepository WHERE Name = @repositoryName)
BEGIN
PRINT 'Repository-Name ist nicht bekannt'
INSERT INTO [dbo].[tbl_ErrorLog]
([repositoryName]
,[commitId]
,[changeLevel]
,[error]
,[timestamp])
VALUES
(@repositoryName
,@commitId
,@changeLevel
,'Repository-Name is unknown'
,SYSDATETIME())
SET @errorOccured = 1;
END
SELECT @repId = InternalRepositoryId FROM
dbo.tbl_GitRepository WHERE
Name = @repositoryName;
IF NOT EXISTS
(SELECT CommitId FROM dbo.tbl_GitCommit WHERE CommitId = @commitId AND InternalRepositoryId = @repId)
BEGIN
PRINT 'CommitId is unknown'
INSERT INTO [dbo].[tbl_ErrorLog]
([repositoryName]
,[commitId]
,[changeLevel]
,[error]
,[timestamp])
VALUES
(@repositoryName
,@commitId
,@changeLevel
,'CommitId is unknown'
,SYSDATETIME())
SET @errorOccured = 1;
END
IF(@errorOccured = 1) RETURN 0;
INSERT INTO [dbo].[tbl_ChangeLevel]
([InternalRepositoryId]
,[CommitId]
,[ChangeLevel])
VALUES
(@repId
,@commitId
,@changeLevel)
END TRY
BEGIN CATCH
PRINT 'Msg: ' + ERROR_MESSAGE();
PRINT ERROR_LINE();
PRINT ERROR_NUMBER();
PRINT 'Procedure: ' + ERROR_PROCEDURE();
PRINT ERROR_STATE();
RETURN 0;
END CATCH
RETURN 1;
END
На самом деле это довольно простой материал, эта хранимая процедура проверяет, являются ли 3 переменные законными/известными, и если да, то их вставляет их в таблицу tbl_ChangeLevel. Для каждой неправильной переменной она создает строку в таблице tbl_ErrorLog, это означает, что у нас есть одна новая строка в tbl_ChangeLevel или 1-3 в tbl_ErrorLog.
В настоящий момент я изменил первый тест на ошибку в ChangeLevel на динамический EXEC, чтобы можно было изменить схему (@schema). Я пробовал буквально все здесь. Сначала я использовал sp_executesql и EXECUTE, но ничего не работало, и теперь, когда я отлаживаю это, он обнаруживает ошибку:
Неправильный ChangeLevel Msg: Неверный синтаксис рядом с ''.
(1 строка (s) пострадавших)
И да это еще не грязь на экране -> '' < - его один из них вещи à, но его нет где в моем коде, я уже искал строку для строки .... У меня были и другие ошибки, такие как Enter-Symbol, "" или "." Я расстроен:/Помощь Pls
Вам нужно больше цитат, чтобы иметь кавычки в вашей фактической вставке. Например, это: '' + @changeLevel + ''должно стать следующим:'' '' + @changeLevel + '' ''. Попробуйте распечатать свою вставку, а не выполнять ее. Также имейте в виду, что способ, которым вы в настоящее время строите свою строку, если один из ваших параметров получает значение «NULL», весь ваш результат будет выглядеть как «NULL». – Jens
Только что заметили, что вы вставляете '' test "' с двойными кавычками. Это должно быть 2 одинарных кавычки, а также '' 'test'''. – Jens