gpt4 book ai didi

sql-server-2008 - INSERT INTO动态添加的列

转载 作者:行者123 更新时间:2023-12-04 06:55:46 25 4
gpt4 key购买 nike

在运行SQL Server 2005/2008时,我正在重写查询,以使其更整洁,更合规,以免出现不良习惯。我曾经有很多IF语句和PIVOT来执行此操作,但是找到了一种更好的方法现在就可以实现它,并且只需要最后一点就可以使其变得完美。

DECLARE @startdate DATETIME;
DECLARE @enddate DATETIME;
DECLARE @showstore INT;
DECLARE @showcashier INT;
DECLARE @showregister INT;
DECLARE @showdate INT;
DECLARE @sql NVARCHAR(MAX);
DECLARE @result0 NVARCHAR(MAX);

SET @startdate = '1/1/2012';
SET @enddate = '2/28/2013';
SET @showdate = 1;
SET @showstore = 0;
SET @showcashier = 1;
SET @showregister = 0;
SET @startdate = DATEADD(DAY, DATEDIFF(DAY, 0, @startdate), 0);
SET @enddate = DATEADD(DAY, DATEDIFF(DAY, 0, @enddate), 0);

SET @sql = N'CREATE TABLE ##a13 (' + SUBSTRING(
CASE WHEN @showdate = 1 THEN ',[Transaction Date] DATETIME' ELSE '' END +
CASE WHEN @showstore = 1 THEN ',[Store ID] VARCHAR(10)' ELSE '' END +
CASE WHEN @showcashier = 1 THEN ',[Cashier] VARCHAR(100)' ELSE '' END +
CASE WHEN @showregister = 1 THEN ',[Register] VARCHAR(20)' ELSE '' END, 2, 2000);

DECLARE myCursor CURSOR FOR
SELECT DISTINCT c.CurrencyDesc
FROM dbo.Currencies AS c INNER JOIN dbo.rpPay AS p ON c.POSCurrency = p.PayType
INNER JOIN dbo.RPTrs AS r ON r.ReceiptNO = p.ReceiptNo
WHERE
c.CurrencyDesc <> 'Testing' AND c.CurrencyDesc <> 'Cash Change' AND
r.TRSDate >= @startdate AND r.TRSDate <= @enddate
OPEN myCursor
FETCH NEXT FROM myCursor INTO @result0
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = @sql + ',[' + @result0 + '] INT'
FETCH NEXT FROM myCursor INTO @result0
END
CLOSE myCursor
DEALLOCATE myCursor

SET @sql = @sql + ')'
EXECUTE sp_executesql @sql, N'@startdate DATETIME,
@enddate DATETIME',@startdate, @enddate;

SET @sql = 'SELECT * FROM ##a13; DROP TABLE ##a13'
EXECUTE sp_executesql @sql


这将返回一个没有行的表。 (请注意,“货币”表中的“货币描述”比此处显示的要多,因为这些只是在提供的日期范围内使用的货币)



这正是我所期望的。到目前为止,一切都很好。现在,我需要根据日期范围( @startdate >= and <= @enddate)并根据它们从4个可能的选项( @showstore, @showcashier, @showdate, @showregister)中选中的内容向其中添加数据行

示例:日期从2013年1月1日到2013年2月28日,并且仅显示注册(如图所示)应具有以下数据:

  | Register | Cash  | House Acct | MasterCard | Visa/MC
--------------------------------------------------------
1 | 01 | 20.00 | 235.25 | 1235.32 | 135.23
2 | 02 | 30.00 | 3542.42 | 323.52 | 523.64
3 | 03 | 23.35 | 100.32 | 3267.24 | 235.25


之所以使用2005/2008,是因为针对该客户端执行了一些客户端,仍然使用2005,并且为了使用 PIVOT,我必须更改每个数据库(2005)的兼容性级别。

PS。在再次大吼大叫之前,如果我使用#a13而不是全局## a13,它会给我

Msg 208, Level 16, State 0, Line 1
Invalid object name '#a13'.


我该怎么办,以免使用全局临时表?

最佳答案

如果我在这里不正确,请澄清。

我相信您在问如何根据用户输入用动态列填充表。正确的答案是,不要那样做!

此类操作的最佳实践是在输出表中包含所有字段,然后在应用程序/显示层中仅显示用户请求的字段。

在TSQL中自定义表布局只是为了进行简洁的介绍,会引入许多不必要的复杂性。这种复杂性也带来了更高的性能成本。

如果您有静态输出表,则使用给定的参数返回数据很简单。

关于sql-server-2008 - INSERT INTO动态添加的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15144107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com