使用动态架构 TSQL SSMS 执行 INSERT
EXEC an INSERT with a dynamic Schema TSQL SSMS
我知道这有点多,但我从 4 天开始就在寻找解决方案。我只想执行一个 INSERT,但我总是在 SSMS
中收到一些神秘的错误消息
INPUT(变量错误,因此错误日志应该被填充):
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 个变量是否为 legit/known,如果是,则将它们插入 tbl_ChangeLevel-table。对于每个错误的变量,它都会在 tbl_ErrorLog-table 中创建一行,这意味着我们要么在 tbl_ChangeLevel 中有一个新行,要么在 tbl_ErrorLog 中有 1-3 行。
目前,我将 ChangeLevel 错误的第一个测试更改为动态 EXEC,以便可以更改架构 (@schema)。我几乎尝试了这里的一切。起初我使用 sp_executesql 和 EXECUTE,但没有任何效果,现在当我调试它时,它发现了一个错误:
ChangeLevel 错误
消息:“̀”附近的语法不正确。
2
102
1
(1 行受影响)
是的,那不是你屏幕上的污垢 -> '̀' <- 它是其中之一,但它在我的代码中没有任何位置,我已经在一行中搜索了一行....我已经有其他错误像一个输入符号,“”或“。我很沮丧:/请帮忙
您必须从 Outlook 或其他来源复制粘贴部分查询。其他来源有不同的编码格式。
如果您有像 Notepad++ 或 ultraedit 这样的文本编辑器,请将您的查询编码更改为 UTF-8 without BOM.
如果问题仍然存在,我建议在 SSMS 查询中重写查询 window。
我知道这有点多,但我从 4 天开始就在寻找解决方案。我只想执行一个 INSERT,但我总是在 SSMS
中收到一些神秘的错误消息INPUT(变量错误,因此错误日志应该被填充):
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 个变量是否为 legit/known,如果是,则将它们插入 tbl_ChangeLevel-table。对于每个错误的变量,它都会在 tbl_ErrorLog-table 中创建一行,这意味着我们要么在 tbl_ChangeLevel 中有一个新行,要么在 tbl_ErrorLog 中有 1-3 行。
目前,我将 ChangeLevel 错误的第一个测试更改为动态 EXEC,以便可以更改架构 (@schema)。我几乎尝试了这里的一切。起初我使用 sp_executesql 和 EXECUTE,但没有任何效果,现在当我调试它时,它发现了一个错误:
ChangeLevel 错误 消息:“̀”附近的语法不正确。
2
102
1
(1 行受影响)
是的,那不是你屏幕上的污垢 -> '̀' <- 它是其中之一,但它在我的代码中没有任何位置,我已经在一行中搜索了一行....我已经有其他错误像一个输入符号,“”或“。我很沮丧:/请帮忙
您必须从 Outlook 或其他来源复制粘贴部分查询。其他来源有不同的编码格式。 如果您有像 Notepad++ 或 ultraedit 这样的文本编辑器,请将您的查询编码更改为 UTF-8 without BOM.
如果问题仍然存在,我建议在 SSMS 查询中重写查询 window。