简体   繁体   中英

SQL Server building variables for query

I'm having problems in simplifying this query.
I need to make 12 a variable so I'll only have to set it once and also the %BrightSide08 .

Because I need to repeat this with different names and lengths.

Declare @len int, @name varchar

SET @len = 12
SET @name = '%BrightSide08'

UPDATE CHAR_DATA0
SET CHAR_DATA = (SELECT CHAR_DATA FROM xtreme.dbo.CHAR_DATA0
                 WHERE CONVERT(VARCHAR(12), SUBSTRING(CHAR_DATA, 9, 16)) LIKE '%BrightSide08')
WHERE CHAR_KEY = (
                SELECT top (1) CHAR_KEY
                FROM CHAR_DATA0
                 WHERE USER_KEY = (SELECT USER_KEY FROM xtreme.dbo.CHAR_DATA0
                 WHERE CONVERT(VARCHAR(12), SUBSTRING(CHAR_DATA, 9, 16)) LIKE '%BrightSide08')
                 )

UPDATE CHAR_INFOR
SET CHARID0 = (SELECT CONVERT(VARCHAR(12), SUBSTRING(CHAR_DATA, 9, 16)) FROM xtreme.dbo.CHAR_DATA0 
               WHERE CONVERT(VARCHAR(12), SUBSTRING(CHAR_DATA, 9, 16)) LIKE '%BrightSide08')
WHERE USER_KEY = (
                SELECT top (1) USER_KEY
                FROM CHAR_DATA0
                 WHERE USER_KEY = (SELECT USER_KEY FROM xtreme.dbo.CHAR_DATA0
                 WHERE CONVERT(VARCHAR(12), SUBSTRING(CHAR_DATA, 9, 16)) LIKE '%BrightSide08')
                 )


SELECT *
FROM CHAR_DATA0
WHERE USER_KEY = (SELECT USER_KEY FROM xtreme.dbo.CHAR_DATA0
                 WHERE CONVERT(VARCHAR(12), SUBSTRING(CHAR_DATA, 9, 16)) LIKE '%BrightSide08')

SELECT *
  FROM [game].[dbo].[CHAR_INFOR]
  WHERE USER_KEY = (
                SELECT top (1) USER_KEY
                FROM game.dbo.CHAR_DATA0
                 WHERE USER_KEY = (SELECT USER_KEY FROM xtreme.dbo.CHAR_DATA0
                 WHERE CONVERT(VARCHAR(12), SUBSTRING(CHAR_DATA, 9, 16)) LIKE '%BrightSide08')
                 )

Am I missing something? Please correct me. Thank you.

You can't supply a variable when specifying a data type. Try making a dynamic sql string:

Declare @len int, @name varchar

SET @len = 12
SET @name = '%BrightSide08'

DECLARE @strSql NVARCHAR(MAX) = 
N'UPDATE CHAR_DATA0
SET CHAR_DATA = (SELECT CHAR_DATA FROM xtreme.dbo.CHAR_DATA0
                 WHERE CONVERT(VARCHAR(' + @len + '), SUBSTRING(CHAR_DATA, 9, 16)) LIKE ''' + @name + ''')
WHERE CHAR_KEY = (
                SELECT top (1) CHAR_KEY
                FROM CHAR_DATA0
                 WHERE USER_KEY = (SELECT USER_KEY FROM xtreme.dbo.CHAR_DATA0
                 WHERE CONVERT(VARCHAR(' + @len + '), SUBSTRING(CHAR_DATA, 9, 16)) LIKE ''' + @name + ''')
                 )

UPDATE CHAR_INFOR
SET CHARID0 = (SELECT CONVERT(VARCHAR(' + @len + '), SUBSTRING(CHAR_DATA, 9, 16)) FROM xtreme.dbo.CHAR_DATA0 
               WHERE CONVERT(VARCHAR(' + @len + '), SUBSTRING(CHAR_DATA, 9, 16)) LIKE ''' + @name + ''')
WHERE USER_KEY = (
                SELECT top (1) USER_KEY
                FROM CHAR_DATA0
                 WHERE USER_KEY = (SELECT USER_KEY FROM xtreme.dbo.CHAR_DATA0
                 WHERE CONVERT(VARCHAR(' + @len + '), SUBSTRING(CHAR_DATA, 9, 16)) LIKE ''' + @name + ''')
                 )


SELECT *
FROM CHAR_DATA0
WHERE USER_KEY = (SELECT USER_KEY FROM xtreme.dbo.CHAR_DATA0
                 WHERE CONVERT(VARCHAR(' + @len + '), SUBSTRING(CHAR_DATA, 9, 16)) LIKE ''' + @name + ''')

SELECT *
  FROM [game].[dbo].[CHAR_INFOR]
  WHERE USER_KEY = (
                SELECT top (1) USER_KEY
                FROM game.dbo.CHAR_DATA0
                 WHERE USER_KEY = (SELECT USER_KEY FROM xtreme.dbo.CHAR_DATA0
                 WHERE CONVERT(VARCHAR(' + @len + '), SUBSTRING(CHAR_DATA, 9, 16)) LIKE ''' + @name + ''')
                 )'

EXEC sp_executesql @strSql

Unfortunately, dynamic SQL does not exactly "simplify" your query.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM