TSQL 控制流逻辑
TSQL Control Flow Logic
我正在构建一个使用基本动态 SQL 的程序。我想在所述过程的另一部分中使用动态 SQL (@query) 的结果。下面是我试图完成的代码的 shorthand 版本。
如果不使用 sp_executesql,我该如何将 @query 的结果值传递到 IF 块中?
DECLARE @table VARCHAR(MAX)
DECLARE @query VARCHAR(MAX)
DECLARE @map VARCHAR(MAX)
SET @table = 'SomeTable'
SET @query = '
;WITH Assignment AS
(
SELECT
''' + @table + ''' AS src
,Type
,RANK () OVER(ORDER BY COUNT(type) as rnk
FROM ' + @table + '
GROUP BY Type
)
SELECT Type
FROM Assignment
WHERE rnk = ''1'''
IF (@query = 'typeA')
BEGIN
/* preform an upsert dynamically */
END
IF (@query = 'typeB')
BEGIN
/* preform a delete dynamically */
END
IF (@query = 'typeC')
BEGIN
/* preform an alter dynamically */
END
为什么在设置了一些 SQL 后立即测试 @query?
你可以用临时的 table:
Create Table #temp(type...)
SET @query = '
;WITH Assignment AS
(
SELECT
''' + @table + ''' AS src
,Type
,RANK () OVER(ORDER BY COUNT(type) as rnk
FROM ' + @table + '
GROUP BY Type
)
Insert Into #temp(type)
SELECT Type
FROM Assignment
WHERE rnk = ''1'''
您还可以在 if 语句中构建动态查询,但我不确定它是否适用于您的情况:
SET @q1 = '
;WITH Assignment AS
(
SELECT
''' + @table + ''' AS src
,Type
,RANK () OVER(ORDER BY COUNT(type) as rnk
FROM ' + @table + '
GROUP BY Type
)'
set @q2 = 'SELECT Type
FROM Assignment
WHERE rnk = ''1'''
Case When @type = 'A' then @query = @q1 + 'Insert into... ' + @q2
Case When @type = 'B' then @query = @q1 + 'Update... ' + @q2
Case When @type = 'B' then @query = @q1 + 'delete from where type in (' + @q2 + ')' end
如果你改变主意,也很容易 sp_executesql:
create table #temp(type int)
insert into #temp
exec sp_executesql @query
或者如果没有数千行:
declare @temp table(type int)
insert into @temp
exec sp_executesql @query
如果只有一行,还是sp_executesql和一个参数,这是最好的选择:
declare @type varchar(10)
SET @query = '
declare @type varchar(10)
;WITH Assignment AS
(
SELECT
''' + @table + ''' AS src
,Type
,RANK () OVER(ORDER BY COUNT(type) as rnk
FROM ' + @table + '
GROUP BY Type
)
SELECT @type = Type
FROM Assignment
WHERE rnk = ''1''';
exec sp_executesql @query, N'@type varchar(10)', @type = @type
这是从动态中获取数据的一种方法SQL
DECLARE @SQL VARCHAR(MAX)
--Dynamic SQL
SET @SQL = '
--Do anything you like in here as long as you select the results in the @Data Table format at the end
SELECT 132'
--How to get the result out of the dynamic SQL (into a table)
DECLARE @Data TABLE (Value INT)
INSERT INTO @Data(Value)
EXEC(@SQL)
--Get the result out of the table into a local (if you need to)
DECLARE @MyValue INT
SELECT @MyValue = Value FROM @Data
--Do what you like with the value now we are back in normal SQL
PRINT @MyValue
我正在构建一个使用基本动态 SQL 的程序。我想在所述过程的另一部分中使用动态 SQL (@query) 的结果。下面是我试图完成的代码的 shorthand 版本。
如果不使用 sp_executesql,我该如何将 @query 的结果值传递到 IF 块中?
DECLARE @table VARCHAR(MAX)
DECLARE @query VARCHAR(MAX)
DECLARE @map VARCHAR(MAX)
SET @table = 'SomeTable'
SET @query = '
;WITH Assignment AS
(
SELECT
''' + @table + ''' AS src
,Type
,RANK () OVER(ORDER BY COUNT(type) as rnk
FROM ' + @table + '
GROUP BY Type
)
SELECT Type
FROM Assignment
WHERE rnk = ''1'''
IF (@query = 'typeA')
BEGIN
/* preform an upsert dynamically */
END
IF (@query = 'typeB')
BEGIN
/* preform a delete dynamically */
END
IF (@query = 'typeC')
BEGIN
/* preform an alter dynamically */
END
为什么在设置了一些 SQL 后立即测试 @query?
你可以用临时的 table:
Create Table #temp(type...)
SET @query = '
;WITH Assignment AS
(
SELECT
''' + @table + ''' AS src
,Type
,RANK () OVER(ORDER BY COUNT(type) as rnk
FROM ' + @table + '
GROUP BY Type
)
Insert Into #temp(type)
SELECT Type
FROM Assignment
WHERE rnk = ''1'''
您还可以在 if 语句中构建动态查询,但我不确定它是否适用于您的情况:
SET @q1 = '
;WITH Assignment AS
(
SELECT
''' + @table + ''' AS src
,Type
,RANK () OVER(ORDER BY COUNT(type) as rnk
FROM ' + @table + '
GROUP BY Type
)'
set @q2 = 'SELECT Type
FROM Assignment
WHERE rnk = ''1'''
Case When @type = 'A' then @query = @q1 + 'Insert into... ' + @q2
Case When @type = 'B' then @query = @q1 + 'Update... ' + @q2
Case When @type = 'B' then @query = @q1 + 'delete from where type in (' + @q2 + ')' end
如果你改变主意,也很容易 sp_executesql:
create table #temp(type int)
insert into #temp
exec sp_executesql @query
或者如果没有数千行:
declare @temp table(type int)
insert into @temp
exec sp_executesql @query
如果只有一行,还是sp_executesql和一个参数,这是最好的选择:
declare @type varchar(10)
SET @query = '
declare @type varchar(10)
;WITH Assignment AS
(
SELECT
''' + @table + ''' AS src
,Type
,RANK () OVER(ORDER BY COUNT(type) as rnk
FROM ' + @table + '
GROUP BY Type
)
SELECT @type = Type
FROM Assignment
WHERE rnk = ''1''';
exec sp_executesql @query, N'@type varchar(10)', @type = @type
这是从动态中获取数据的一种方法SQL
DECLARE @SQL VARCHAR(MAX)
--Dynamic SQL
SET @SQL = '
--Do anything you like in here as long as you select the results in the @Data Table format at the end
SELECT 132'
--How to get the result out of the dynamic SQL (into a table)
DECLARE @Data TABLE (Value INT)
INSERT INTO @Data(Value)
EXEC(@SQL)
--Get the result out of the table into a local (if you need to)
DECLARE @MyValue INT
SELECT @MyValue = Value FROM @Data
--Do what you like with the value now we are back in normal SQL
PRINT @MyValue