Ошибка преобразования при преобразовании значения nvarchar 'SELECT * FROM - PullRequest
2 голосов
/ 07 октября 2011

Используя Sql Server 2008, разработал представление "vw_MasterView", я получаю эту ошибку:

Conversion failed when converting the nvarchar value 'SELECT * FROM VW_MASTERVIEW v WHERE 1=1  AND v.ClinicId = '' to data type int.

когда я запускаю следующую хранимую процедуру:

USE [xxxxxxx]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ClientSummary1]
    @LocationId int,
    @startDate datetime,
    @endDate datetime,
    @userName nvarchar(50)
AS
    declare @sql nvarchar(2000);
    SET NOCOUNT ON
    set @sql = 'SELECT * FROM VW_MASTERVIEW v WHERE 1=1 ';
    IF @LocationId is not null
    begin
        set @sql = @sql + ' AND v.LocationId = ''' + @LocationId + '''';
    end
    if @userName is not null
    begin
        set @sql = @sql + ' AND (v.FirstUser = '' OR v.SecondUser = '')' + @userName + '''';
    end
    if @startDate is not null 
    begin
       set @sql = @sql + ' AND v.FirstVisitDate = ''' + @startDate + ''''; 
    end
    if @endDate is not null 
    begin
        set @sql = @sql + ' AND v.LastVisitDate = ''' + @endDate + ''''; 
    end

    EXEC(@sql)

Я получаю LocationId и userName из приложения VS2010. Заранее спасибо

1 Ответ

4 голосов
/ 07 октября 2011

При добавлении строк вместе в SQL Server необходимо преобразовывать нетекстовые типы (например, int) в текстовый тип (например, varchar):

set @sql = @sql + ' AND v.LocationId = ''' +
    cast(@LocationId as varchar(10)) + '''';
--  ^^^^ have to cast           ^^ make sure size is big enough

Обратите внимание, что динамическийSQL не должен быть необходим в первую очередь.Вы можете просто выполнить запрос напрямую с параметрами (я реализовал нулевые проверки с дополнительными or условиями):

SELECT * FROM VW_MASTERVIEW v
 WHERE (v.LocationId = @LocationId    OR @LocationId is null)
   AND (v.FirstUser = @userName OR v.Seconduser = @userName OR @userName is null)
   AND (v.FirstVisitDate = @startDate OR @startDate is null)
   AND (v.LastVisitDate = @endDate    OR @endDate is null)

У меня может не быть логики для FirstUser и SecondUser -Я сделал обоснованное предположение из вашего неполного кода.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...