Ошибка динамического SQL при преобразовании nvarchar в int - PullRequest
8 голосов
/ 17 мая 2011

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

ALTER PROCEDURE cagroup    (
    @DataID INT ,
    @days INT ,
    @GName VARCHAR(50) ,
    @T_ID INT ,
    @Act BIT ,
    @Key VARBINARY(16)
)
AS
BEGIN
    DECLARE @SQL NVARCHAR(MAX)
    DECLARE @SchemaName SYSNAME
    DECLARE @TableName SYSNAME
    DECLARE @DatabaseName SYSNAME
    DECLARE @BR CHAR(2)
    SET @BR = CHAR(13) + CHAR(10)

    SELECT  @SchemaName = Source_Schema ,
            @TableName = Source_Table ,
            @DatabaseName = Source_Database
    FROM    Source
    WHERE   ID = @DataID

SET @SQL =  'SELECT ' + @GName + ' AS GrName ,' + @BR
                + @T_ID + ' AS To_ID ,' + @BR
                + @DataID + ' AS DataSoID ,' + @BR
                + @Act + ' AS Active ,' + @BR
                + Key + ' AS key' + @BR
                + 'R_ID AS S_R_ID' + @BR
                + 'FROM' + @DatabaseName + '.'
                + @SchemaName + '.'
                + @TableName + ' t' + @BR
                + 'LEFT OUTER JOIN Gro g ON g.GName = '
                    + @GName + @BR + 'AND g.Data_ID] =' + @DataID + @BR
                    + 't.[I_DATE] > GETDATE() -' + @days + @BR
                    + 'g.GName IS NULL
                        AND ' + @GName + ' IS NOT NULL
                        AND t.[Act] = 1' + @BR

    PRINT (@SQL)
END

Когда я выполняю эту процедуру с этим оператором:

Exec  dbo.cagroup  1,10,'[Gro]',1,1,NULL

Я получаю следующую ошибку:

Сообщение 245, Уровень 16, Состояние 1, Процедурная группа, Строка 33 Преобразование завершилось неудачно при преобразовании значения nvarchar «SELECT [Gro] AS GName» в тип данных int.

Где я не так делаю?

Ответы [ 2 ]

14 голосов
/ 17 мая 2011

Вы должны CAST все числа в nvarchar в конкатенации.

Нет неявного преобразования стиля VBA в строку.В SQL Server приоритет типов данных означает, что целые числа больше, чем nvarchar: поэтому вся строка пытается быть CAST to int.

SET @SQL =  'SELECT ' + @GName + ' AS GrName ,' + @BR
              + CAST(@T_ID AS nvarchar(10)) + ' AS To_ID ,' ...

Редактировать: Будет ли А иметь хорошую точку: следите за NULL!

1 голос
/ 19 мая 2011

Если вам нужно построить такой динамический SQL, лучше получить информацию о столбце из метаданных, чем передавать ее.

Select * from Information_Schema.Columns Where Table_name=@TableName

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

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