2017-02-22 60 views
0

Ошибка: Неверный синтаксис рядом с ','. (Процедура spAddNewDataToHoldingTable, строка 71)Неверный синтаксис рядом с ','. при использовании Exec

Цель: Вставка данных в таблицу (который я создал с помощью другой хранимой процедуры)

Мысли: Я попробовал несколько комбинаций апострофа, и если я получаю SQL для тогда это означает отсутствие апострофа перед первым значением и, следовательно, ошибку.

Надеюсь, что один апостроф в неправильном месте - это все.

ЕСЛИ у меня не было имени переменной, которую я мог бы запустить без EXEC, но я также хочу сделать ее безопасной.

Код:

USE [DB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spAddNewDataToHoldingTable] 

@sTableName varchar(50), 
@sPMNUM varchar(8), 
@sUPRN varchar(510) , 
@sSurveyDate Date, 
@sVFMDISCIPLINE varchar(4) , 
@sVFMDISCIPLINEELEMENT varchar(510) , 
@sWorkOrder varchar(510) , 
@sNextSurveyDue Date , 
@sRiskCategory varchar(510) , 
@sDocURL varchar(MAX) , 
@sDocLinks varchar(MAX) , 
@sVINCIRISKLevel varchar(510) , 
@sRemedialActionWO varchar(510) , 
@sRemedialActionDate date, 
@sComments varchar(MAX) , 
@sRISKNUM varchar(510) , 
@sRISKOWNER varchar(510) , 
@sSurveyorsComments varchar(MAX) , 
@sRecommendations varchar(510) , 
@sStatusOfIssue int , 
@sClientContract varchar(12) , 
@sJPNUM varchar(12) 


AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
SET NOCOUNT ON; 

DECLARE @sTablename_ AS varchar(max) 

SET @sTablename_ = LTRIM(RTRIM(@sTableName)) 

DECLARE @sql NVARCHAR(2500) 

SET @sql = ' 
INSERT INTO ' + @sTablename_ + ' 
(
PMNUM, 
UPRN, 
VFMDISPLINE, 
VFMDISPLINEELEMENT, 
WorkOrder, 
RiskCategory, 
DocURL, 
DocLinks, 
VINCIRISKLevel, 
RemedialActionWO, 
Comments, 
RISKNUM, 
RISKOWNER, 
SurveyorsComments, 
Recommendation, 
StatusOfIssue, 
ClientContract, 
JPNUM, 
RemedialActionDate , 
SurveyDate , 
NextSurveyDate 
) 

VALUES 

(''' 

+ ''' + QUOTENAME(@sPMNUM) + ''' 
, ''' + QUOTENAME(@sUPRN) + ''' 
, ''' + QUOTENAME(@sVFMDISCIPLINE) + ''' 
, ''' + QUOTENAME(@sVFMDISCIPLINEELEMENT) + ''' 
, ''' + QUOTENAME(@sWorkOrder) + ''' 
, ''' + QUOTENAME(@sRiskCategory) + ''' 
, ''' + QUOTENAME(@sDocURL) + ''' 
, ''' + QUOTENAME(@sDocLinks) + ''' 
, ''' + QUOTENAME(@sVINCIRISKLevel) + ''' 
, ''' + QUOTENAME(@sRemedialActionWO) + ''' 
, ''' + QUOTENAME(@sComments) + ''' 
, ''' + QUOTENAME(@sRISKNUM) + ''' 
, ''' + QUOTENAME(@sRISKOWNER) + ''' 
, ''' + QUOTENAME(@sSurveyorsComments) + ''' 
, ''' + QUOTENAME(@sRecommendations) + ''' 
, ''' + QUOTENAME(@sStatusOfIssue + ''' 
, ''' + QUOTENAME(@sClientContract) + ''' 
, ''' + QUOTENAME(@sJPNUM) + ''' 
, ''' + QUOTENAME(@sRemedialActionDate) + ''' 
, ''' + QUOTENAME(@sSurveyDate) + ''' 
, ''' + QUOTENAME(@sNextSurveyDue) + ''' 
+ ''')''' 

EXEC (@sql) 

END 

Ref:

SQL Server incorrect syntax near ')' Incorrect syntax near '(' and near '='

+0

Ваш список значений содержит запятые, которые не являются частью строки SQL (они не цитироваться) – JohnHC

+3

заменить 'EXEC (@sql)' 'по ВЫБРАТЬ (@sql)' или 'печать @ sql' – McNets

+1

Единственное, что является динамическим, - это имя вашей таблицы, это означает, что вы «делаете это неправильно». У вас созданы динамические таблицы (с теми же столбцами), а не с соответствующей структурой базы данных. – Jamiec

ответ

0

Вы добавили еще один ''»

здесь обновляется один

USE [DB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spAddNewDataToHoldingTable] 

@sTableName varchar(50), 
@sPMNUM varchar(8), 
@sUPRN varchar(510) , 
@sSurveyDate Date, 
@sVFMDISCIPLINE varchar(4) , 
@sVFMDISCIPLINEELEMENT varchar(510) , 
@sWorkOrder varchar(510) , 
@sNextSurveyDue Date , 
@sRiskCategory varchar(510) , 
@sDocURL varchar(MAX) , 
@sDocLinks varchar(MAX) , 
@sVINCIRISKLevel varchar(510) , 
@sRemedialActionWO varchar(510) , 
@sRemedialActionDate date, 
@sComments varchar(MAX) , 
@sRISKNUM varchar(510) , 
@sRISKOWNER varchar(510) , 
@sSurveyorsComments varchar(MAX) , 
@sRecommendations varchar(510) , 
@sStatusOfIssue int , 
@sClientContract varchar(12) , 
@sJPNUM varchar(12) 


AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
SET NOCOUNT ON; 

DECLARE @sTablename_ AS varchar(max) 

SET @sTablename_ = LTRIM(RTRIM(@sTableName)) 

DECLARE @sql NVARCHAR(2500) 

SET @sql = ' 
INSERT INTO ' + @sTablename_ + ' 
(
PMNUM, 
UPRN, 
VFMDISPLINE, 
VFMDISPLINEELEMENT, 
WorkOrder, 
RiskCategory, 
DocURL, 
DocLinks, 
VINCIRISKLevel, 
RemedialActionWO, 
Comments, 
RISKNUM, 
RISKOWNER, 
SurveyorsComments, 
Recommendation, 
StatusOfIssue, 
ClientContract, 
JPNUM, 
RemedialActionDate , 
SurveyDate , 
NextSurveyDate 
) 

VALUES 

(''' + QUOTENAME(@sPMNUM) + ''' 
, ''' + QUOTENAME(@sUPRN) + ''' 
, ''' + QUOTENAME(@sVFMDISCIPLINE) + ''' 
, ''' + QUOTENAME(@sVFMDISCIPLINEELEMENT) + ''' 
, ''' + QUOTENAME(@sWorkOrder) + ''' 
, ''' + QUOTENAME(@sRiskCategory) + ''' 
, ''' + QUOTENAME(@sDocURL) + ''' 
, ''' + QUOTENAME(@sDocLinks) + ''' 
, ''' + QUOTENAME(@sVINCIRISKLevel) + ''' 
, ''' + QUOTENAME(@sRemedialActionWO) + ''' 
, ''' + QUOTENAME(@sComments) + ''' 
, ''' + QUOTENAME(@sRISKNUM) + ''' 
, ''' + QUOTENAME(@sRISKOWNER) + ''' 
, ''' + QUOTENAME(@sSurveyorsComments) + ''' 
, ''' + QUOTENAME(@sRecommendations) + ''' 
, ''' + QUOTENAME(@sStatusOfIssue) + ''' 
, ''' + QUOTENAME(@sClientContract) + ''' 
, ''' + QUOTENAME(@sJPNUM) + ''' 
, ''' + QUOTENAME(@sRemedialActionDate) + ''' 
, ''' + QUOTENAME(@sSurveyDate) + ''' 
, ''' + QUOTENAME(@sNextSurveyDue) + ''')' 

EXEC (@sql) 

END 
+1

Проверьте закрытие ')' - Я думаю, что также слишком много котировок –

+0

Да, спасибо, обновлено –

1

Вам не нужно использовать quotename() на всех этих устройствах, он просто обертывает их в квадратных скобках.

Не забудьте указать convert()date datatypes to varchar.

ALTER PROCEDURE [dbo].[spAddNewDataToHoldingTable] 

@sTableName varchar(50), 
@sPMNUM varchar(8), 
@sUPRN varchar(510) , 
@sSurveyDate Date, 
@sVFMDISCIPLINE varchar(4) , 
@sVFMDISCIPLINEELEMENT varchar(510) , 
@sWorkOrder varchar(510) , 
@sNextSurveyDue Date , 
@sRiskCategory varchar(510) , 
@sDocURL varchar(MAX) , 
@sDocLinks varchar(MAX) , 
@sVINCIRISKLevel varchar(510) , 
@sRemedialActionWO varchar(510) , 
@sRemedialActionDate date, 
@sComments varchar(MAX) , 
@sRISKNUM varchar(510) , 
@sRISKOWNER varchar(510) , 
@sSurveyorsComments varchar(MAX) , 
@sRecommendations varchar(510) , 
@sStatusOfIssue int , 
@sClientContract varchar(12) , 
@sJPNUM varchar(12) 


AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
SET NOCOUNT ON; 

DECLARE @sTablename_ AS varchar(max) 

SET @sTablename_ = LTRIM(RTRIM(@sTableName)) 

DECLARE @sql NVARCHAR(2500) 

SET @sql = ' 
INSERT INTO ' + @sTablename_ + ' 
(
PMNUM, 
UPRN, 
VFMDISPLINE, 
VFMDISPLINEELEMENT, 
WorkOrder, 
RiskCategory, 
DocURL, 
DocLinks, 
VINCIRISKLevel, 
RemedialActionWO, 
Comments, 
RISKNUM, 
RISKOWNER, 
SurveyorsComments, 
Recommendation, 
StatusOfIssue, 
ClientContract, 
JPNUM, 
RemedialActionDate , 
SurveyDate , 
NextSurveyDate 
) 

VALUES 

(' 

+ '''' + @sPMNUM    + '''' 
+ ', ''' + @sUPRN     + '''' 
+ ', ''' + @sVFMDISCIPLINE  + '''' 
+ ', ''' + @sVFMDISCIPLINEELEMENT + '''' 
+ ', ''' + @sWorkOrder   + '''' 
+ ', ''' + @sRiskCategory   + '''' 
+ ', ''' + @sDocURL    + '''' 
+ ', ''' + @sDocLinks    + '''' 
+ ', ''' + @sVINCIRISKLevel  + '''' 
+ ', ''' + @sRemedialActionWO  + '''' 
+ ', ''' + @sComments    + '''' 
+ ', ''' + @sRISKNUM    + '''' 
+ ', ''' + @sRISKOWNER   + '''' 
+ ', ''' + @sSurveyorsComments + '''' 
+ ', ''' + @sRecommendations  + '''' 
+ ', ''' + @sStatusOfIssue  + '''' 
+ ', ''' + @sClientContract  + '''' 
+ ', ''' + @sJPNUM    + '''' 
+ ', ''' + convert(varchar(10),@sRemedialActionDate,120)+ '''' 
+ ', ''' + convert(varchar(10),@sSurveyDate,120)  + '''' 
+ ', ''' + convert(varchar(10),@sNextSurveyDue,120)  + '''' 
+ ');' 

EXEC (@sql) 
END; 
0

Чтобы избежать одиночной цитаты, вам необходимо удвоить ее. Поэтому «» «„“» будут возвращены как «»

Итак, ваш код должен выглядеть следующим образом:

SET @sql = ' 
INSERT INTO ' + @sTablename_ + ' 
(
PMNUM, 
UPRN, 
VFMDISPLINE, 
VFMDISPLINEELEMENT, 
WorkOrder, 
RiskCategory, 
DocURL, 
DocLinks, 
VINCIRISKLevel, 
RemedialActionWO, 
Comments, 
RISKNUM, 
RISKOWNER, 
SurveyorsComments, 
Recommendation, 
StatusOfIssue, 
ClientContract, 
JPNUM, 
RemedialActionDate , 
SurveyDate , 
NextSurveyDate 
) 

VALUES 

(
''' + QUOTENAME(@sPMNUM) + ''' 
, ''' + QUOTENAME(@sUPRN) + ''' 
, ''' + QUOTENAME(@sVFMDISCIPLINE) + ''' 
, ''' + QUOTENAME(@sVFMDISCIPLINEELEMENT) + ''' 
, ''' + QUOTENAME(@sWorkOrder) + ''' 
, ''' + QUOTENAME(@sRiskCategory) + ''' 
, ''' + QUOTENAME(@sDocURL) + ''' 
, ''' + QUOTENAME(@sDocLinks) + ''' 
, ''' + QUOTENAME(@sVINCIRISKLevel) + ''' 
, ''' + QUOTENAME(@sRemedialActionWO) + ''' 
, ''' + QUOTENAME(@sComments) + ''' 
, ''' + QUOTENAME(@sRISKNUM) + ''' 
, ''' + QUOTENAME(@sRISKOWNER) + ''' 
, ''' + QUOTENAME(@sSurveyorsComments) + ''' 
, ''' + QUOTENAME(@sRecommendations) + ''' 
, ''' + QUOTENAME(@sStatusOfIssue) + ''' 
, ''' + QUOTENAME(@sClientContract) + ''' 
, ''' + QUOTENAME(@sJPNUM) + ''' 
, ''' + QUOTENAME(@sRemedialActionDate) + ''' 
, ''' + QUOTENAME(@sSurveyDate) + ''' 
, ''' + QUOTENAME(@sNextSurveyDue) + ''')' 
+0

Почему мой ответ проголосовал? Он разрешает проблему OP относительно неправильного синтаксиса в данном запросе. –

0

Я не думаю, что вы должны использовать динамический SQL здесь, вам вместо этого следует исправить дизайн, из-за чего вам потребуется несколько таблиц с одной и той же схемой. Однако, если вы собираетесь придерживаться этого, вам нужно использовать параметры в вашем динамическом sql вместо того, чтобы пытаться бороться с одиночными кавычками повсюду. И просто добавление набора двойных одинарных кавычек только задерживает проблемы с этим. Вот как вы можете сделать это с помощью динамического sql и параметризовать все значения.

ALTER PROCEDURE [dbo].[spAddNewDataToHoldingTable] 
(
    @sTableName varchar(50), 
    @sPMNUM varchar(8), 
    @sUPRN varchar(510) , 
    @sSurveyDate Date, 
    @sVFMDISCIPLINE varchar(4) , 
    @sVFMDISCIPLINEELEMENT varchar(510) , 
    @sWorkOrder varchar(510) , 
    @sNextSurveyDue Date , 
    @sRiskCategory varchar(510) , 
    @sDocURL varchar(MAX) , 
    @sDocLinks varchar(MAX) , 
    @sVINCIRISKLevel varchar(510) , 
    @sRemedialActionWO varchar(510) , 
    @sRemedialActionDate date, 
    @sComments varchar(MAX) , 
    @sRISKNUM varchar(510) , 
    @sRISKOWNER varchar(510) , 
    @sSurveyorsComments varchar(MAX) , 
    @sRecommendations varchar(510) , 
    @sStatusOfIssue int , 
    @sClientContract varchar(12) , 
    @sJPNUM varchar(12) 
) AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @sql NVARCHAR(max) 

    SET @sql = N' 
    INSERT INTO ' + QUOTENAME(LTRIM(RTRIM(@sTableName))) + ' 
    (
     PMNUM 
     , UPRN 
     , VFMDISPLINE 
     , VFMDISPLINEELEMENT 
     , WorkOrder 
     , RiskCategory 
     , DocURL 
     , DocLinks 
     , VINCIRISKLevel 
     , RemedialActionWO 
     , Comments 
     , RISKNUM 
     , RISKOWNER 
     , SurveyorsComments 
     , Recommendation 
     , StatusOfIssue 
     , ClientContract 
     , JPNUM 
     , RemedialActionDate 
     , SurveyDate 
     , NextSurveyDate 
    ) 
    VALUES 
    (
     @sPMNUM 
     , @sUPRN 
     , @sVFMDISCIPLINE 
     , @sVFMDISCIPLINEELEMENT 
     , @sWorkOrder 
     , @sRiskCategory 
     , @sDocURL 
     , @sDocLinks 
     , @sVINCIRISKLevel 
     , @sRemedialActionWO 
     , @sComments 
     , @sRISKNUM 
     , @sRISKOWNER 
     , @sSurveyorsComments 
     , @sRecommendations 
     , @sStatusOfIssue 
     , @sClientContract 
     , @sJPNUM 
     , @sRemedialActionDate 
     , @sSurveyDate 
     , @sNextSurveyDue 
    )' 

    EXEC sp_executesql @sql 
     , N'@sPMNUM varchar(8) 
      , @sUPRN varchar(510) 
      , @sVFMDISCIPLINE varchar(4) 
      , @sVFMDISCIPLINEELEMENT varchar(510) 
      , @sWorkOrder varchar(510) 
      , @sRiskCategory varchar(510) 
      , @sDocURL varchar(MAX) 
      , @sDocLinks varchar(MAX) 
      , @sVINCIRISKLevel varchar(510) 
      , @sRemedialActionWO varchar(510) 
      , @sComments varchar(MAX) 
      , @sRISKNUM varchar(510) 
      , @sRISKOWNER varchar(510) 
      , @sSurveyorsComments varchar(MAX) 
      , @sRecommendations varchar(510) 
      , @sStatusOfIssue int 
      , @sClientContract varchar(12) 
      , @sJPNUM varchar(12) 
      , @sRemedialActionDate varchar(10) 
      , @sSurveyDate varchar(10) 
      , @sNextSurveyDue varchar(10)' 
     , @sPMNUM = @sPMNUM 
     , @sUPRN = @sUPRN 
     , @sVFMDISCIPLINE = @sVFMDISCIPLINE 
     , @sVFMDISCIPLINEELEMENT = @sVFMDISCIPLINEELEMENT 
     , @sWorkOrder = @sWorkOrder 
     , @sRiskCategory = @sRiskCategory 
     , @sDocURL = @sDocURL 
     , @sDocLinks = @sDocLinks 
     , @sVINCIRISKLevel = @sVINCIRISKLevel 
     , @sRemedialActionWO = @sRemedialActionWO 
     , @sComments = @sComments 
     , @sRISKNUM = @sRISKNUM 
     , @sRISKOWNER = @sRISKOWNER 
     , @sSurveyorsComments = @sSurveyorsComments 
     , @sRecommendations = @sRecommendations 
     , @sStatusOfIssue = @sStatusOfIssue 
     , @sClientContract = @sClientContract 
     , @sJPNUM = @sJPNUM 
     , @sRemedialActionDate = @sRemedialActionDate 
     , @sSurveyDate = @sSurveyDate 
     , @sNextSurveyDue = @sNextSurveyDue  
END;