Хранимая процедура, дающая разные результаты в одной и той же базе данных с одним и тем же аргументом

У меня есть хранимая процедура, которая дает разные результаты только в конкретном случае.

Когда я вызываю его из SQL Server Management Studio 2008 R2, он дает мне 0 в качестве вывода.

Когда я вызываю его из файла класса С#. Это дает мне 1 в качестве вывода.

Я использую файл edmx, и он точно обновлен.

Вызов выглядит примерно так, как показано ниже, из SSMS [SQL Server Management Studio]

exec proc_GetPrimaryKeyUsageCount 62, 'tblFormula'

Это дает вывод как 0

Та же хранимая процедура вызывается из файла С#, как показано ниже.

_db.GetPrimaryKeyUsageCount(62, "tblFormula");

Это дает вывод как 1

Хранимая процедура

CREATE PROCEDURE proc_GetPrimaryKeyUsageCount (  
 @PrimaryKeyColumnId INT  
 ,@PrimaryKeyTable NVARCHAR(max)  
 --,@Response INT OUTPUT  
 )  
AS  
BEGIN  
 DECLARE @counter INT  
 DECLARE @sqlCommand NVARCHAR(max)  
 DECLARE @ForeignKey TABLE (  
  child_table VARCHAR(max)  
  ,child_fk_column VARCHAR(max)  
  )  
 DECLARE @child_table VARCHAR(max)  
 DECLARE @child_fk_column VARCHAR(max)  

 SET @counter = 0  

 INSERT INTO @ForeignKey  
 SELECT child_table = c.TABLE_NAME  
  ,child_fk_column = c.COLUMN_NAME  
 FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE p  
 INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS pc ON pc.UNIQUE_CONSTRAINT_SCHEMA = p.CONSTRAINT_SCHEMA  
  AND pc.UNIQUE_CONSTRAINT_NAME = p.CONSTRAINT_NAME  
 INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE c ON c.CONSTRAINT_SCHEMA = pc.CONSTRAINT_SCHEMA  
  AND c.CONSTRAINT_NAME = pc.CONSTRAINT_NAME  
 WHERE EXISTS (  
   SELECT 1  
   FROM INFORMATION_SCHEMA.COLUMNS  
   WHERE COLUMN_NAME = 'IsDeleted'  
    AND TABLE_SCHEMA = p.TABLE_SCHEMA  
    AND TABLE_NAME = p.TABLE_NAME  
    AND p.TABLE_NAME = @PrimaryKeyTable  
   )  

 DECLARE db_cursor CURSOR  
 FOR  
 SELECT child_table  
  ,child_fk_column  
 FROM @ForeignKey  

 OPEN db_cursor  

 FETCH NEXT  
 FROM db_cursor  
 INTO @child_table  
  ,@child_fk_column  

 WHILE @@FETCH_STATUS = 0  
 BEGIN  
  PRINT 'select count(*) from ' + CAST(@child_table AS VARCHAR) + ' where ' + CAST(@child_fk_column AS VARCHAR) + ' = ' + CAST(@PrimaryKeyColumnId AS VARCHAR)  

  SET @sqlCommand = 'select @cnt=count(*) from ' + CAST(@child_table AS VARCHAR) + ' where ' + CAST(@child_fk_column AS VARCHAR) + ' = ' + CAST(@PrimaryKeyColumnId AS VARCHAR)  

  EXEC sp_executesql @sqlCommand  
   ,N'@cnt int OUTPUT'  
   ,@cnt = @counter OUTPUT  

  IF @counter > 0  
   BREAK  

  FETCH NEXT  
  FROM db_cursor  
  INTO @child_table  
   ,@child_fk_column  
 END  

 SELECT @counter AS [PrimaryKeyUsageCount]  
END  

1-й аргумент — это идентификатор первичного ключа, а 2-й аргумент — это имя таблицы, имеющей этот первичный ключ.

Процедура возвращает количество использования первичного ключа в других таблицах той же базы данных. Если он найдет даже 1 вхождение, он вернет этот счетчик, в противном случае 0.

Если что-то дополнительное необходимо, пожалуйста, дайте мне знать.


person Nisarg Shah    schedule 14.03.2014    source источник


Ответы (1)


Есть пара ошибок, из-за которых может возникнуть проблема. INSERT должен быть таким:

INSERT INTO @ForeignKey  
 SELECT c.TABLE_NAME,c.COLUMN_NAME  
 FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE p  
 INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS pc ON pc.UNIQUE_CONSTRAINT_SCHEMA = p.CONSTRAINT_SCHEMA  
  AND pc.UNIQUE_CONSTRAINT_NAME = p.CONSTRAINT_NAME  
 INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE c ON c.CONSTRAINT_SCHEMA = pc.CONSTRAINT_SCHEMA  
  AND c.CONSTRAINT_NAME = pc.CONSTRAINT_NAME  
 WHERE EXISTS (  
   SELECT *  
   FROM INFORMATION_SCHEMA.COLUMNS AS isc 
   WHERE isc.COLUMN_NAME = 'IsDeleted'  
    AND isc.TABLE_SCHEMA = p.TABLE_SCHEMA  
    AND isc.TABLE_NAME = p.TABLE_NAME  
    AND p.TABLE_NAME = @PrimaryKeyTable  
   ) 

После цикла курсора должно быть:

CLOSE db_cursor
DEALLOCATE db_cursor
person pistipanko    schedule 14.03.2014
comment
Но это совсем не моя проблема. Моя проблема связана со значением, которое я получаю в своей сопоставленной функции. - person Nisarg Shah; 19.03.2014