2014-10-23 5 views
0

이것은 재미 있습니다. 갑자기 다른 버전의 데이터베이스 (외부 도구)에서 실행해야하는보기가 있습니다. 내가 뭘하고 싶지 정확히 하나의 쿼리를 가지고있다 (사례/IF 존재 또는 교차 조인 또는 당신이 가진 마법의 트릭의 어떤 방식을 사용).테이블 존재 여부에 관계없이 실행되는 쿼리 작성

기본적으로 주어진 테이블이 존재할 경우 해당 테이블의 행 수가 반환됩니다. 그렇지 않으면 NULL을 반환하고 싶습니다. https://dba.stackexchange.com/questions/66741/why-cant-i-use-a-case-statement-to-see-if-a-column-exists-and-not-select-from-i

나는

CASE WHEN EXISTS (SELECT 1 FROM sys.tables WHERE [object_id] = OBJECT_ID('possibleTable') 
THEN (SELECT COUNT(1) FROM possibleTable WHERE mycondition) 
ELSE (SELECT NULL) 
END 
을 사용할 수 없습니다

그것은 주어진 열이 테이블에 존재하는지 여부를 쿼리를 작성하는 방법을 다루는이 질문의 "표"버전의

... 테이블이 존재하지 않을 때 코드가 실행되지 않더라도 컴파일 타임에 바인딩을 시도하기 때문에 테이블이 존재하지 않을 때 오류가 발생합니다.

기본적으로 새 테이블의 개수를 포함 시키려면 CTE를 늘려야하지만 테이블이 없으면 실패하지 않아야합니다. 테이블이 있는지를 확인하고 두 개의 다른 CTE 중 하나를 실행하기 위해 데이터베이스를 다시 왕복해야하는 것은 나에게 불쾌한 것처럼 보입니다. 그러나 지금까지는 더 좋은 방법을 찾지 못했습니다.

누구나 그러한 일을 할 수있는 SQL 마법을 가지고 있다면 재미있는 "CROSS JOIN"트릭이 가능할 수도 있습니다.

+0

쿼리에서는이 작업을 수행 할 수 없지만 SQL 프로 시저로 수행 할 수 있습니다. 예를 들어,'IF..ELSE ... '예제는 실제로 SQL 쿼리가 아닌 SQL * 프로 시저 * (또는 스크립트)입니다. 그래서, 당신의 예제'IF..' 프로 시저/스크립트는 그것을하기 위해 수정 될 수 있습니다. 하지만 .. 단일 쿼리를 중심으로 뷰를 정의 할 수는 있지만 프로 시저/스크립트로 작성할 수는 없습니다. – RBarryYoung

+0

저장 프로 시저를 사용할 수 없다고 가정하지만 DB에 대해 원하는 모든 SQL 스크립트를 실행할 수 있습니다 ... 어떻게 수행 할 것인지 잘 모르겠습니다 (현재 테스트 중이며 지금 실행중인 방법입니다) SQL Server Management Studio의 쿼리 창에있는 스크립트) ... 내 문제는 큰 스크립트이고 테이블이 있는지 여부에 따라 NULL 또는 COUNT 인 결과 집합에 하나 이상의 열을 추가하기 만하면됩니다. – pmbAustin

+1

동적 SQL을 사용하여 테이블을 선택하는 방법은 어떻습니까? 테이블이 존재할 때 전체 테이블을 읽는 대신 DMV에서 카운트를 얻기 위해'sys.partitions'를 호출 할 수도 있습니다. 하지만 더 중요한 것은 왜 존재할 수있는 테이블에 대해 하드 코딩 된 이름을 사용하여 코드를 작성하고 있습니까? –

답변

0

왜 함수를 사용하지 않습니까?

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

create FUNCTION [dbo].[fn_checktable] 
(
    -- Add the parameters for the function here 
    @checktable nvarchar(max) 
) 
RETURNS nvarchar(100) 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @result int 

    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].['[email protected]+']') AND type in (N'U')) 
     set @result = 1 
    else 
     set @result = 0 


    endsave: 
    -- Return the result of the function 
    RETURN @result 

END 

GO 

은 어쩌면 내가 missunderstood,

select case when dbo.fn_checktable('YOURTABLENAME') = 1 
    then (select top 1 'whatever' from YOURTABLENAME) 
    else 'nothing' end as something 

('YOURTABLENAME') dbo.fn_checktable 선택의 결과 인 1 또는 0

처럼 사용하지만. 당신은 "줄의 수"를 썼습니다 ... 흠, 나는 더 많은 의견이 필요하다고 생각합니다.

+0

이 아이디어의 주요 문제점은 DB를 사용하기 위해 수정해야한다는 것입니다. 기본적으로 내 도구는 시작할 때 함수를 설치하고 중지 할 때 정리해야합니다. 그러나 이것은 내가 본 "일"에 가장 가까운 것입니다. 나는 개념 증명을 관리 할 수 ​​있었고 효과가있는 것으로 보인다. 필자는이 기능을 설치해야하므로 구현할 수 있는지 여부를 알 수 없습니다 (이 도구는 지금까지 읽기 /보고 만 가능). 감사! – pmbAustin

+0

아마도 두 번째 DB를 매핑하거나이 함수를 임시 DB에 저장할 수 있습니다. – MattOpen

관련 문제