我正在尝试在SQL Server中创建动态查询。
输入: @value= abc,def,en,
输出: MAX(abc) as abc, MAX(def) as def, MAX(en) as en
到目前为止,我的努力没有让我失望。
使用CONVERT()和REPLACE()我实现了一点但发现很难。需要帮助!
答案 0 :(得分:1)
试试这个:
declare @value varchar(50) = 'abc,def,en'
declare @result varchar(100) = ''
select @result = replace(@value,'abc', 'MAX(''abc'') as abc')
select @result = replace(@result,'def', 'MAX(''def'') as def')
select @result = replace(@result,'en', 'MAX(''en'') as en')
select @result
您也可以通过嵌套表达式在一行中进行替换。
编辑:如果@value中有变量值,您可以采用以下方法:
使用STUFF将值连接成单个字符串,如下所示:
select stuff((select ',' + val from #temp for xml path('')),1,1,'')
答案 1 :(得分:1)
试试这个:
DECLARE @Value VARCHAR(200) = 'abc,def,en'
DECLARE @Template VARCHAR(100) = 'MAX(''##'') as ##'
DECLARE @Result VARCHAR(1000) = ''
DECLARE @Data VARCHAR(100) = ''
WHILE LEN(@Value) > 0
BEGIN
SET @Data = REPLACE(LEFT(@Value, ISNULL(NULLIF(CHARINDEX(',', @Value),0), LEN(@Value))),',','')
SET @Result = @Result + REPLACE(@Template, '##', @Data)
IF CHARINDEX(',', @Value) > 0
BEGIN
SET @Result = @Result + ','
SET @Value = REPLACE(@Value,@Data + ',','')
END
ELSE
SET @Value = REPLACE(@Value,@Data,'')
END
SELECT @Result
答案 2 :(得分:0)
查看SQL User Defined Function to Parse a Delimited String
所以你可以这样做
Declare @Value varchar(200) = 'abc,def,en'
Declare @Item varchar(20) = null
declare @Str varchar(1000)=''
WHILE LEN(@Value) > 0
BEGIN
IF PATINDEX('%,%',@Value) > 0
BEGIN
SET @Item = SUBSTRING(@Value, 0, PATINDEX('%,%',@Value))
-- SELECT @Item
IF(LEN(@Str)>0)
SET @Str = @Str + ', SELECT MAX('+@Item+') as ' +@Item
ELSE
SET@Str = @Str + ' SELECT MAX('+@Item+') as ' +@Item
SET @Value = SUBSTRING(@Value, LEN(@Item + ',') + 1, LEN(@Value))
END
ELSE
BEGIN
SET @Item = @Value
SET @Value = NULL
SET @Str = @Str + 'SELECT MAX('+@Item+') as ' + @Item
END
END
select @Str
查看小提琴样本here