как присвоить целочисленное значение типу данных nvarchar или varchar в хранимой процедуре - PullRequest
2 голосов
/ 28 января 2010

как присвоить целочисленное значение типу данных nvarchar или varchar в хранимой процедуре

DECLARE @SQLString nvarchar(max)

SET @SQLString = N'declare @Identifier int;
                   SELECT  COUNT(*) FROM ' + @batch+' where Identifier = @Identifier'

Мне нужно проверить, равен ли @SQLString 0 или нет.

т.е. я хочу проверить -----> if (@SQLString = 0). как назначить целое число для nvarchar или varchar

Ответы [ 5 ]

1 голос
/ 29 января 2010

Я думаю, что так лучше:

DECLARE
   @Cnt int,
   @SQL nvarchar(max),
   @batch sysname,
   @Identifier varchar(30)

-- set @batch and @Identifier

SET @SQL = 'SELECT @Cnt = Count(*) FROM ' + @batch
   + ' WHERE Identifier = @Identifier'
EXEC sp_executesql @SQL, N'@Cnt int OUT, @Identifier varchar(30)',
   @Cnt OUT, @Identifier
IF @Cnt = 0 BEGIN
   --do something
END
ELSE BEGIN
   --do something else
END

Хотя, если вас волнует только 0 или нет, вы должны сделать это вместо этого, что может прекратиться после нахождения только одной строки вместо того, чтобы считать их все:

DECLARE
   @HasRows bit,
   @SQL nvarchar(max),
   @batch sysname,
   @Identifier varchar(30)

-- set @batch and @Identifier

SET @SQL = 'SET @HasRows = CASE WHEN EXISTS (SELECT 1 FROM '
  + @batch + ' WHERE Identifier = @Identifier) THEN 1 ELSE 0 END'
EXEC sp_executesql @SQL, N'@HasRows bit OUT, @Identifier varchar(30)',
   @HasRows OUT, @Identifier
IF @HasRows = 0 BEGIN
   --do something
END
ELSE BEGIN
   --do something else
END

Однако, если есть какой-либо способ избежать динамического SQL и изменения имен таблиц, это было бы лучше всего. Тогда это простой запрос:

IF NOT EXISTS (SELECT 1 FROM TableName WHERE Identifier = @Identifier) BEGIN
   -- do something
END
1 голос
/ 28 января 2010

Вы можете попробовать что-то вроде

DECLARE @IntVal INT,
        @ParamDef NVARCHAR(MAX),
        @SQLString nvarchar(max),
        @batch VARCHAR(MAX)

SELECT  @batch = 'Batch',
        @SQLString = N'SELECT @IntVal = COUNT(*) FROM ' + @batch,
        @ParamDef = '@IntVal INT OUTPUT'

EXECUTE sp_executesql  @SQLString,@ParamDef, @IntVal=@IntVal OUT

SELECT @IntVal

Взгляните на sp_executesql (Transact-SQL)

0 голосов
/ 28 января 2010

Вы устанавливаете @SQLString для запроса ... если вы хотите увидеть, является ли он '0', то вы можете просто сделать:

IF @SQLString = '0'

Но я думаю, что вы пытаетесь выяснить, есть ли в вашем пакете 0 строк, в этом случае вы имеете в виду нечто большее, например:

DECLARE @Res TABLE (cnt int);
INSERT @Res exec sp_executesql @SQLString;

IF (SELECT MAX(cnt) FROM @Res) = 0 /* Means empty batch */
0 голосов
/ 28 января 2010

Я предполагаю, что вы пытаетесь проверить, сколько строк вернул динамический SQL, вы можете сделать что-то вроде этого:

DECLARE @SQLString nvarchar(max) 

SET @SQLString = N'declare @Identifier int; 
                   SELECT  * FROM ' + @batch+' where Identifier = @Identifier'

exec @SQLString

set @SQLString = @@ROWCOUNT

if @SQLString = 0
begin
...
end
0 голосов
/ 28 января 2010

преобразовать его:

SET @var = CONVERT (VARCHAR, @intval)

Sascha

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