2016-10-24 3 views
1

Я знаю, что это немного, но я ищу решение с 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

+0

Вам нужно больше цитат, чтобы иметь кавычки в вашей фактической вставке. Например, это: '' + @changeLevel + ''должно стать следующим:'' '' + @changeLevel + '' ''. Попробуйте распечатать свою вставку, а не выполнять ее. Также имейте в виду, что способ, которым вы в настоящее время строите свою строку, если один из ваших параметров получает значение «NULL», весь ваш результат будет выглядеть как «NULL». – Jens

+0

Только что заметили, что вы вставляете '' test "' с двойными кавычками. Это должно быть 2 одинарных кавычки, а также '' 'test'''. – Jens

ответ

2

Вы должны скопировать часть своего запроса из Outlook или другого источника. Другие источники имеют другой формат кодирования. Если у вас есть текстовый редактор, например Notepad ++ или ultraedit, измените кодировку запроса на UTF-8 без спецификации.

Если проблема по-прежнему сохраняется, я бы рекомендовал переписать запрос в окне запроса SSMS.

+0

Это исправило эту проблему благодаря –

Смежные вопросы