我有一張Depots看起來像這樣的表:
| 倉庫ID | 倉庫名稱 | 倉庫位置 | 別名 |
|---|---|---|---|
| 1 | 歐蘭 | Utsacity | 歐拉 |
| 2 | 英格里 | Utsacity | 英格拉斯 |
| 3 | 土耳其人 | Utsacity | 圖爾庫 |
| 4 | 夯實 | 烏西馬 | 坦佩雷 |
| 5 | 科科斯 | 烏西馬 | 科庫拉 |
| 6 | 考斯 | 奧隆巴 | 考卡納 |
我在宣告的變數中存盤了一個逗號分隔的列串列 @ValList
DECLARE @ValList varchar(8000);
SET @ValList = NULL
SELECT @ValList = COALESCE(@ValList ', ','') ColumnName
FROM #list
@ValList 回傳 DepotID, DepotName, DepLocation
我想傳入@ValList如下的 select 陳述句
SELECT @ValList FROM Depots
所以我得到
| 倉庫ID | 倉庫名稱 | 倉庫位置 |
|---|---|---|
| 1 | 歐蘭 | Utsacity |
| 2 | 英格里 | Utsacity |
| 3 | 土耳其人 | Utsacity |
| 4 | 夯實 | 烏西馬 |
| 5 | 科科斯 | 烏西馬 |
| 6 | 考斯 | 奧隆巴 |
但我不斷得到類似的東西
| (無列名) |
|---|
| DepotID、DepotName、DepLocation |
| DepotID、DepotName、DepLocation |
| DepotID、DepotName、DepLocation |
| DepotID、DepotName、DepLocation |
| DepotID、DepotName、DepLocation |
| DepotID、DepotName、DepLocation |
我究竟做錯了什么?
uj5u.com熱心網友回復:
不確定您可以或應該信任列串列來源的程度,但最安全的方法如下,您可以檢查 中的每一列是否存在sys.columns:
CREATE TABLE #list(ColumnName sysname);
INSERT #list(ColumnName)
VALUES(N'DepotID'),(N'DepotName'),(N'DepLocation');
DECLARE @sql nvarchar(max), @cols nvarchar(max) = N'';
SELECT @cols = N',' QUOTENAME(c.name)
FROM #List AS l
INNER JOIN sys.columns AS c
ON l.ColumnName = c.name
WHERE c.[object_id] = OBJECT_ID(N'dbo.Depots');
SET @sql = N'SELECT ' STUFF(@cols, 1, 1, N'')
N' FROM dbo.Depots';
EXEC sys.sp_executesql @sql;
- 示例資料庫<>小提琴
保護自己免受 SQL 注入:第 1 部分| 第2部分
uj5u.com熱心網友回復:
您似乎對動態 TSQL 感興趣。嘗試使用sp_executesql例如。
DECLARE @ValList varchar(8000);
SET @ValList = 'DepotID, DepotName, DepotLocation';
SELECT @ValList as ColumnNames;
DECLARE @MyQuery NVARCHAR(4000) = CONCAT(N'SELECT ',@ValList,N' FROM Depots');
EXECUTE sp_executesql @MyQuery;
| 列名 |
|---|
| DepotID、DepotName、DepotLocation |
| 倉庫ID | 倉庫名稱 | 倉庫位置 |
|---|---|---|
| 1 | 歐蘭 | Utsacity |
| 2 | 英格里 | Utsacity |
| 3 | 土耳其人 | Utsacity |
| 4 | 夯實 | 烏西馬 |
| 5 | 科科斯 | 烏西馬 |
| 6 | 考斯 | 奧隆巴 |
查看作業演示
讓我知道這是否適合您。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320746.html
標籤:sql sql-server 变量 动态-sql
上一篇:為什么即使我輸入了正確的資訊,if-else陳述句也沒有給我正確的提示?
下一篇:使用變數過濾器列出檔案
