Hitesh Vaghasiya Ответов: 2

exec не удалось, потому что имя не является допустимым идентификатором?


USE [ABC]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[LibFetchFilterItem]
@Query nvarchar(1000)

AS
Begin
set nocount on

DECLARE @str varchar(8000)

SET @str = N'
  select ID
  ,case  when i.CodeVersion>1 then i.Code+''+.+''+convert(varchar,i.CodeVersion) else i.Code end as Code
  ,i.OldCode
  ,HRMS.dbo.InitialCap(i.[Name]) as Name
  ,i.[Description]
  ,d.DeptName as Department
  ,HRMS.dbo.InitialCap(p.[Name]) as Product
  ,Edition
  ,[Version]
  ,PublisherBrand
  ,Country
  ,KeywordDesc
  ,l.[name] as Location
  ,HRMS.dbo.InitialCap(s.[Name]) as SubCategory
  ,Synopsis
  ,i.Website
  from LIBMstItem i inner join LIBMstLocation l  on i.LocationId=l.LocationId
  inner join LIBMstProduct p on i.ProductCategory = p.Id
  Left outer join  HRMS.dbo.Master_EmployeeMaster u on i.BroughtBy=u.[NewID]
  Left outer join  dynamicreport.dbo.CompanyMst c on i.CompanyId = c.CompanyId
  Left outer join  HRMS.dbo.Master_DepartmentMaster d on i.DepartmentID = d.RowID
  inner join LIBMstSubCategory s on  i.SubCategory = s.Id
  where (i.Scrap is null or i.Scrap=0) 
  and i.IsActive=1
  and i.KitId=0' + ' '  + @Query + ' ' +
  'and 0=0 order by i.ID'
 
PRINT @str
EXEC @str

end
go

Когда я выполняю описанную выше процедуру, она успешно компилируется, но когда я запускаю ее с помощью этого оператора EXEC LibFetchFilterItem 'и i.Code="10"' затем

Msg 203, Уровень 16, Состояние 2, Процедура LibFetchFilterItem, Строка 40
Имя '
выберите идентификатор
,случай, когда я.CodeVersion и GT;1 тогда я.Код+'+.+'+конвертировать(тип varchar,я.CodeVersion) еще я.Конец код как код
я.OldCode
,HRMS.dbo.InitialCap(i.[Name]) в качестве имени
,i.[описание]
д DeptName как отдел
,HRMS.dbo.InitialCap(p.[Name]) как продукт
,Издание
,[Версия]
,PublisherBrand
,Страна
,KeywordDesc
,l.[имя] как местоположение
,HRMS.dbo.InitialCap(s.[Имя]) как подкатегория
,Краткий обзор
,i.веб-сайт
из LIBMstItem я внутреннее соединение LIBMstLocation Л О я.Идентификатор locationId=л.Идентификатор locationId
внутреннее соединение LIBMstProduct P на мне.Категорияпродукта = стр. Идентификатор
Left outer join HRMS.dbo.Master_EmployeeMaster u on i.Brought' не является допустимым идентификатором.

произошла ошибка .. Но когда я просто печатаю запрос, он на 100% прав ...
Пожалуйста, помогите мне ...

_Asif_

Вы не опубликовали значение @Query. Дайте нам знать значение @Query.

Hitesh Vaghasiya

Старпома LibFetchFilterItem - и я.код="10".

Здесь
и я.код="10"
является ли значение @Query

_Asif_

можете ли вы вставить последний запрос. Кроме того, вы проверили запрос, выполнив последний в анализаторе запросов?

2 Ответов

Рейтинг:
2

Member 14528263

используйте EXEC (@str), это должно решить вашу проблему.


CHill60

Я предполагаю, что вы получили пониженный голос, потому что это такой старый пост, на который вы ответили. Однако вы правы. Было бы неплохо, если бы вы объяснили, почему: без скобок вы пытаетесь выполнить хранимую процедуру или функцию; с помощью скобок вы пытаетесь выполнить содержимое строки. Ссылка: EXECUTE (Transact-SQL) - SQL Server | Microsoft Docs[^]

Рейтинг:
1

coded007

Попробуйте это и дайте нам знать

USE [ABC]
GO
 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[LibFetchFilterItem]
@Query nvarchar(1000)
 
AS
Begin
set nocount on
 
DECLARE @str varchar(8000)
 
SET @str = N'
  select ID
  ,case  when i.CodeVersion>1 then i.Code+''+'''.'''+''+convert(varchar,i.CodeVersion) else i.Code end as Code
  ,i.OldCode
  ,HRMS.dbo.InitialCap(i.[Name]) as Name
  ,i.[Description]
  ,d.DeptName as Department
  ,HRMS.dbo.InitialCap(p.[Name]) as Product
  ,Edition
  ,[Version]
  ,PublisherBrand
  ,Country
  ,KeywordDesc
  ,l.[name] as Location
  ,HRMS.dbo.InitialCap(s.[Name]) as SubCategory
  ,Synopsis
  ,i.Website
  from LIBMstItem i inner join LIBMstLocation l  on i.LocationId=l.LocationId
  inner join LIBMstProduct p on i.ProductCategory = p.Id
  Left outer join  HRMS.dbo.Master_EmployeeMaster u on i.BroughtBy=u.[NewID]
  Left outer join  dynamicreport.dbo.CompanyMst c on i.CompanyId = c.CompanyId
  Left outer join  HRMS.dbo.Master_DepartmentMaster d on i.DepartmentID = d.RowID
  inner join LIBMstSubCategory s on  i.SubCategory = s.Id
  where (i.Scrap is null or i.Scrap=0) 
  and i.IsActive=1
  and i.KitId=0' + ' '  + @Query + ' ' +
  'and 0=0 order by i.ID'
 
PRINT @str
EXEC @str
 
end
go


Я надеюсь, что это решит вашу проблему