우리의 문서 저장 응용 프로그램에는 각 클라이언트마다 거의 동일한 서로 다른 데이터베이스가 있지만 각 클라이언트마다 하나의 테이블 DocumentIndexes
은 고유합니다. 임의의 개수의 열과 유형이 있습니다.문자열을 반환하는 사용자 정의 함수에서 동적 SQL 사용
전화 할 수있는 데이터베이스 (예 : MYAPP_MASTER
)의 일반 기능을 만들려고하는데 데이터베이스 이름과 문서 ID 값을 전달하고 지정된 이름에서 값과 열 이름을 다시 가져옵니다. 데이터베이스의 DocumentIndexes
테이블 데이터베이스 이름을 전달해야하므로 선택 SQL을 동적으로 생성하고 sp_executesql
을 호출해야합니다.
필요한 코드를 확인하기 위해 INFORMATION_SCHEMA.COLUMNS
테이블을 폴링하는 다음 코드는 저장 프로 시저에서 올바르게 작동하지만 이러한 동적 코드를 검색하는 데 필요한 모든 저장 프로 시저에서이 코드를 모두 복사해야합니다. 값. 차라리 데이터베이스에 관계없이이 열의 문자열 값을 반환하는 함수를 하나 가지고 있는데이 함수는 데이터베이스 MYAPP_MASTER
에 한 번 존재합니다. 다시 말하지만,이 코드는 작동하지만 SQL은 함수에 넣을 수 없습니다. 이 주변에 어쨌든 있습니까? SAMPLE_CLIENT_DB
datababase DocumentIndexes
테이블 이름, 사무실 및 분류에 대한 열이
USE MYAPP_MASTER
GO
DECLARE @DatabaseName varchar(255)
DECLARE @DocumentId int
SET @DatabaseName = 'SAMPLE_CLIENT_DB'
SET @DocumentId = 1234
DECLARE @DynamicIndexes nvarchar(max)
DECLARE @DynamicIndexesParam nvarchar(max)
DECLARE @DynamicIndexesSql nvarchar(max)
SET @DynamicIndexesParam = '@Indexes varchar(max) OUTPUT'
SET @DynamicIndexesSql = 'SELECT @Indexes = COALESCE(@Indexes + ''+ '''', '', '''') + CAST(COLUMN_NAME as varchar(max)) + '': '''''' + '' + CASE WHEN DI.'' + COLUMN_NAME + '' IS NOT NULL THEN CAST(DI.'' + COLUMN_NAME + '' as varchar(max)) ELSE '''''''' END '' FROM ' + @DatabaseName + '.INFORMATION_SCHEMA.COLUMNS WHERE table_name = ''DocumentIndexes'' AND COLUMN_NAME <> ''DocumentID''; '
EXEC sp_executesql @DynamicIndexesSql, @DynamicIndexesParam, @Indexes = @DynamicIndexes OUTPUT
SET @DynamicIndexes = '''' + @DynamicIndexes
DECLARE @SelectionSql nvarchar(max)
SET @SelectionSql = 'SELECT ' + @DynamicIndexes + ' as DocumentIndexes FROM ' + @DatabaseName + '..Document D LEFT OUTER JOIN ' + @DatabaseName + '..DocumentIndexes DI ON D.DocumentId = DI.DocumentId WHERE D.DocumentID = ' + CAST(@DocumentId as varchar(10))
EXEC sp_executesql @SelectionSql
경우,이 코드처럼 보이는 간단한 문자열을 반환합니다 다음은 :
Name: Foo, Office: Bar, Classification: 123
+1 우수 질문. – LarsH